basic_data_type

SKILL.md

仓颉语言基本数据类型 Skill

注意:这些基础数据类型都实现了 ToString 接口,都可以直接打印或用于插值字符串,也可以调用toString成员函数显式转String类型

1. 整数类型

1.1 类型列表

  • 有符号整数Int8Int16Int32Int64IntNative
  • 无符号整数UInt8UInt16UInt32UInt64UIntNative
  • 有符号 N 位范围:−2^(N−1) ~ 2^(N−1)−1;无符号 N 位范围:0 ~ 2^N−1
  • IntNative/UIntNative 为平台相关宽度
  • 默认整数类型为 Int64(无上下文时字面量默认推断为 Int64

1.2 整数字面量

  • 二进制0b0B 前缀,例如 0b00011000
  • 八进制0o0O 前缀,例如 0o30
  • 十进制:无前缀,例如 24
  • 十六进制0x0X 前缀,例如 0x18
  • 允许使用下划线 _ 分隔:0b0001_1000
  • 超出范围的值会导致编译错误

1.3 整数字面量后缀

后缀 类型 后缀 类型
i8 Int8 u8 UInt8
i16 Int16 u16 UInt16
i32 Int32 u32 UInt32
i64 Int64 u64 UInt64

示例:100i80x10u640o432i32

1.4 字节字面量

  • 语法:b'x',表示 UInt8 类型的 ASCII 值
  • 支持转义:b'\n'b'\\'
  • Unicode 转义:b'\u{78}'(最多 2 位十六进制,值 < 256)

1.5 整数支持的运算

  • 算术运算、位运算、关系运算、自增/自减(++/--)、复合赋值
  • 可在整数类型之间转换、与浮点互转、转换为 Rune

1.6 数值类型转换

  • 仓颉使用类型构造函数语法进行数值转换,没有 .toInt64() 等方法:
    let n = Int64(value)           // 将其他数值类型转换为 Int64
    let u = UInt32(runeValue)      // 将 Rune 转换为 UInt32
    let f = Float64(intValue)      // 将整数转换为 Float64
    let r = Rune(intValue)         // 将整数转换为 Rune
    
  • 字符串解析为数值使用 parse 静态方法(需导入 std.convert.*):
    import std.convert.*
    let n = Int64.parse("42")       // 解析失败抛异常
    let f = Float64.parse("3.14")   // 解析失败抛异常
    

2. 浮点类型

2.1 类型列表

  • Float16(二进制16位,约3位有效数字)
  • Float32(二进制32位,约6位有效数字)
  • Float64(二进制64位,约15位有效数字)

2.2 浮点字面量

  • 十进制:须有整数部分或小数部分;指数用 e/E(以10为底),例如 3.142e32.4e-1
  • 十六进制0x/0X 前缀;须有指数用 p/P(以2为底),例如 0x1.1p00x1p2

2.3 浮点字面量后缀(仅限十进制)

后缀 类型
f16 Float16
f32 Float32
f64 Float64

注意只有以上三种后缀,没有 f 后缀

2.4 浮点支持的运算

  • 算术运算、关系运算、复合赋值
  • 不支持 自增/自减(++/--
  • 可在浮点类型间转换,也可与整数类型互转

3. 布尔类型

  • 类型:Bool
  • 字面量:truefalse
  • 支持运算符:
    • 逻辑运算:!(非)、&&(与)、||(或)
    • 关系运算:==!=
    • 复合赋值:&&=||=

4. 字符类型(Rune)

  • 类型:Rune,表示所有 Unicode 字符
  • 字面量前缀为 r,后跟单引号或双引号

三种字面量形式

  1. 单字符r'a'r"b"
  2. 转义字符r'\\'r'\n'r'\t'
  3. Unicode 字符r'\u{4f60}'(1~8 位十六进制)

支持的运算

  • 关系运算:<><=>===!=(比较 Unicode 值)
  • RuneUInt32 转换;任意整数类型 → Rune 转换
  • Rune 不支持算术运算+-*/ 等均不可用),需要先转换为整数类型再计算:
    // 错误:Rune 不支持减法
    // let diff = c - r'0'  // 编译错误
    
    // 正确:先转换为 UInt32
    let diff = UInt32(c) - UInt32(r'0')
    
    // 计算结果可通过 Rune(intValue) 转换回 Rune
    let nextChar = Rune(UInt32(c) + 1)
    

5. 字符串类型

  • 类型:String,Unicode 字符序列

5.1 三类字面量

  1. 单行字符串:用 '...'"..." 包围。不可含未转义的匹配引号或单独的 \。须在一行内。
  2. 多行字符串:用 """..."""'''...''' 包围。内容从第一个换行后开始。可跨行。支持转义。
  3. 多行原始字符串#"..."###'...'## 等。起止 # 数量须匹配。不进行转义处理

5.2 隐式转换

  • 当左侧为 ByteUInt8 别名)且右侧为 ASCII 字符串字面量时,可隐式转换为 Byte
  • 当左侧为 Rune 且右侧为单字符字符串字面量时,可隐式转换为 Rune

5.3 字符串插值

  • 语法:"text ${expression} text"
  • ${} 中可包含声明和表达式;使用 {} 中的最后一个值
  • 不适用于 原始字符串字面量

5.4 支持的运算

  • 关系运算符用于比较
  • + 用于拼接

5.5 字符串迭代

  • for (c in s) 迭代的是字节(UInt8/Byte,因为 String 实现了 Collection<Byte>(UTF-8 编码字节序列)
  • for (c in s.runes()) 迭代的是字符(Rune,返回 Iterator<Rune>
  • 这与大多数编程语言的行为不同,需要特别注意:
    // c 是 UInt8 类型(字节)
    for (c in "你好") { ... }
    
    // c 是 Rune 类型(Unicode 字符)
    for (c in "你好".runes()) { ... }
    
  • toRuneArray() 方法可将字符串转换为 Array<Rune>

6. Unit 类型

  • 类型:Unit
  • 唯一值/字面量:()
  • 用于仅产生副作用的表达式:print、赋值、复合赋值、自增/自减、循环
  • 仅支持:赋值、==!=

7. Nothing 类型

  • 类型:Nothing
  • 不包含任何值
  • 所有类型的子类型(包括 Unit
  • breakcontinuereturnthrow 表达式的类型
  • 这些表达式之后的代码不可达
  • return 须在函数体内使用;break/continue 须在循环内使用
  • 目前不能作为显式类型标注使用

8. 元组类型

  • 语法:(T1, T2, ..., TN),最少 2 个元素
  • 固定长度元素不可变(但 var 声明的元组变量本身可重新赋值)
  • 字面量:(e1, e2, ..., eN)

8.1 元素访问

  • t[index]index 为编译时整数字面量,从 0 开始
  • 越界索引导致编译错误

8.2 具名类型参数

  • (name: String, price: Int64) — 所有参数须全部具名或全部不具名
  • 名称仅在类型层面有效;不能用作访问器

8.3 元组相等性

  • ==/!= 仅在所有元素类型都支持 ==/!= 时可用
  • 两个元组相等当且仅当所有对应元素相等

8.4 多元赋值

  • (a, b) = (1, 2) — 并行赋值
  • (a, b) = (b, a) — 交换
  • _ 忽略某个位置:(a, _) = (3, 4)

9. 数组类型

9.1 Array<T>

  • 有序、单元素类型集合,固定长度(不支持增删)
  • Array<T>struct 类型,但内部通过引用共享数据 — let arr2 = arr1 后两者共享底层存储,修改互相可见
  • 字面量:[e1, e2, ...];空数组:[](需要类型上下文)
  • 构造方式:
    • Array<Int64>() — 空数组
    • Array<Int64>(3, repeat: 0) — 3 个元素全为 0
    • Array<Int64>(3, {i => i + 1}) — lambda 初始化
  • 访问:arr[i]Int64 索引,从 0 开始);负数或越界 → 编译错误或运行时异常
  • 切片:arr[0..5]arr[..3]arr[2..](使用 Range)
  • 修改:arr[0] = 3,元素可修改
  • .size 属性获取元素数量
  • 可用 for (i in arr) 迭代

9.2 VArray<T, $N>(值类型)

  • 值类型固定长度数组:VArray<T, $N>
  • $N 为字面量 Int64 长度;<T, $N> 不可省略
  • 限制:元素类型 T 不能包含引用类型、枚举、lambda(CFunc 除外)或未实例化的泛型
  • 字面量初始化:var a: VArray<Int64, $3> = [1, 2, 3]
  • 构造方式:
    • VArray<Int64, $5>({i => i}) — lambda 初始化
    • VArray<Int64, $5>(repeat: 0) — 重复初始化
  • a[i] 访问/修改;.size 获取长度
  • Array 的 GC 压力小,但赋值时复制(避免在性能敏感代码中使用大型 VArray)
  • 支持 C 互操作

10. 区间类型(Range)

  • 泛型类型:Range<T>(T 须支持关系运算和与 Int64 的加法)
  • 包含 startend(类型 T)、stepInt64,不能为 0)
  • 构造函数:Range<T>(start, end, step, hasStart, hasEnd, isClosed)

10.1 区间字面量

  • 半开区间(左闭右开):start..end : step — 不包含 end
  • 闭区间(左闭右闭):start..=end : step — 包含 end
  • step 省略时默认为 1;step 不能为 0

10.2 空区间

  • start..end : step 为空:当 step > 0 && start >= endstep < 0 && start <= end
  • start..=end : step 为空:当 step > 0 && start > endstep < 0 && start < end

11. 基本运算符

11.1 赋值运算符 =

  • 先计算右侧,再计算左侧,然后赋值
  • 赋值表达式的类型为 Unit(值为 ()
  • 不支持链式赋值a = b = 0 是语法错误
  • 多元赋值(a, b) = (1, 2)(a, b) = (b, a) 用于交换;_ 忽略

11.2 算术运算符

运算符 说明 操作数类型
-(一元) 取负 数值类型
+ 加(也用于字符串拼接) 相同数值类型
- 相同数值类型
* 相同数值类型
/ 除(整数除法向零截断) 相同数值类型
% 取模 a - b*(a/b) 仅整数
** Int64^UInt64→Int64,`Float64^(Int64
  • 溢出会被检测并报错(运行时错误)

11.3 复合赋值运算符

**=*=/=%=+=-=<<=>>=&=^=|=&&=||=

11.4 关系运算符

==!=<<=>>=

11.5 逻辑运算符

运算符 说明 短路求值
! 非(一元前缀) 不适用
&& 是:false && xfalse
` `

11.6 位运算符(仅整数类型)

运算符 说明
!(一元) 按位取反
<< 左移(低位补 0)
>> 右移(无符号补 0;有符号正数补 0,负数补 1)
& 按位与
^ 按位异或
| 按位或
  • 移位量须为非负且小于操作数位宽

11.7 自增/自减运算符

  • expr++ / expr--仅后缀,仅整数类型
  • 等价于 expr += 1 / expr -= 1
  • 结果类型为 Unit(不能用作值)

11.8 合并运算符 ??

  • 用于 Option<T> 解包
  • e1 ?? e2:若 e1Some(v)v(短路,e2 不求值);若 Nonee2
  • ?? 的优先级很低(16),低于比较运算符(==/!= 为 10,</> 为 9),混合使用时须加括号:
let opt: ?Int64 = 42
let value = 10

// ❌ 错误:?? 优先级低于 !=,实际解析为 opt ?? (default != value)
// if (opt ?? default != value) { ... }

// ✅ 正确:使用括号明确优先级
if ((opt ?? 0) != value) { ... }

11.9 区间运算符

  • .. — 半开区间(左闭右开)
  • ..= — 闭区间(左闭右闭)
  • 可选步长 : step

11.10 运算符优先级表

优先级数值越小,优先级越高。

优先级 运算符 含义 结合方向
0 @ 宏调用 右结合
1 . [] () 成员访问、索引、函数调用 左结合
2 ++ -- ? 自增、自减、问号操作符
3 ! -(一元) 按位取反/逻辑非、一元负号 右结合
4 ** 幂运算 右结合
5 * / % 乘、除、取模 左结合
6 + - 加、减 左结合
7 << >> 按位左移、右移 左结合
8 .. ..= 区间操作符
9 < <= > >= is as 比较、类型检查/转换
10 == != 判等、判不等
11 & 按位与 左结合
12 ^ 按位异或 左结合
13 | 按位或 左结合
14 && 逻辑与 左结合
15 || 逻辑或 左结合
16 ?? coalescing 操作符 右结合
17 |> ~> pipeline、composition 左结合
18 = += -= *= 赋值、复合赋值

常见陷阱?? 在优先级 16,远低于 ==/!=(10)和 </>(9),因此 opt ?? default != value 会被解析为 opt ?? (default != value),而非 (opt ?? default) != value。混用时须加括号。


Weekly Installs
2
First Seen
3 days ago
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1