| name | cangjie-basic-data-type |
| description | 仓颉语言基本数据类型。当需要了解仓颉语言的整数、浮点、布尔、字符(Rune)、字符串(String)、Unit、Nothing、元组(Tuple)、数组(Array/VArray)、区间(Range)类型以及基本运算符的语法和规则时,应使用此 Skill。 |
仓颉语言基本数据类型 Skill
1. 整数类型
1.1 类型列表
- 有符号整数:
Int8、Int16、Int32、Int64、IntNative
- 无符号整数:
UInt8、UInt16、UInt32、UInt64、UIntNative
- 有符号 N 位范围:−2^(N−1) ~ 2^(N−1)−1;无符号 N 位范围:0 ~ 2^N−1
IntNative/UIntNative 为平台相关宽度
- 默认整数类型为
Int64(无上下文时字面量默认推断为 Int64)
1.2 整数字面量
- 二进制:
0b 或 0B 前缀,例如 0b00011000
- 八进制:
0o 或 0O 前缀,例如 0o30
- 十进制:无前缀,例如
24
- 十六进制:
0x 或 0X 前缀,例如 0x18
- 允许使用下划线
_ 分隔:0b0001_1000
- 超出范围的值会导致编译错误
1.3 整数字面量后缀
| 后缀 | 类型 | 后缀 | 类型 |
|---|
i8 | Int8 | u8 | UInt8 |
i16 | Int16 | u16 | UInt16 |
i32 | Int32 | u32 | UInt32 |
i64 | Int64 | u64 | UInt64 |
示例:100i8、0x10u64、0o432i32
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.14、2e3、2.4e-1
- 十六进制:
0x/0X 前缀;须有指数用 p/P(以2为底),例如 0x1.1p0、0x1p2
2.3 浮点字面量后缀(仅限十进制)
| 后缀 | 类型 |
|---|
f16 | Float16 |
f32 | Float32 |
f64 | Float64 |
注意只有以上三种后缀,没有 f 后缀
2.4 浮点支持的运算
- 算术运算、关系运算、复合赋值
- 不支持 自增/自减(
++/--)
- 可在浮点类型间转换,也可与整数类型互转
3. 布尔类型
- 类型:
Bool
- 字面量:
true、false
- 支持运算符:
- 逻辑运算:
!(非)、&&(与)、||(或)
- 关系运算:
==、!=
- 复合赋值:
&&=、||=
4. 字符类型(Rune)
- 类型:
Rune,表示所有 Unicode 字符
- 字面量前缀为
r,后跟单引号或双引号
三种字面量形式
- 单字符:
r'a'、r"b"
- 转义字符:
r'\\'、r'\n'、r'\t'
- Unicode 字符:
r'\u{4f60}'(1~8 位十六进制)
支持的运算
5. 字符串类型
5.1 三类字面量
- 单行字符串:用
'...' 或 "..." 包围。不可含未转义的匹配引号或单独的 \。须在一行内。
- 多行字符串:用
"""...""" 或 '''...''' 包围。内容从第一个换行后开始。可跨行。支持转义。
- 多行原始字符串:
#"..."#、##'...'## 等。起止 # 数量须匹配。不进行转义处理。
5.2 隐式转换
- 当左侧为
Byte(UInt8 别名)且右侧为 ASCII 字符串字面量时,可隐式转换为 Byte
- 当左侧为
Rune 且右侧为单字符字符串字面量时,可隐式转换为 Rune
5.3 字符串插值
- 语法:
"text ${expression} text"
${} 中可包含声明和表达式;使用 {} 中的最后一个值
- 不适用于 原始字符串字面量
5.4 支持的运算
5.5 字符串迭代
6. Unit 类型
- 类型:
Unit
- 唯一值/字面量:
()
- 用于仅产生副作用的表达式:
print、赋值、复合赋值、自增/自减、循环
- 仅支持:赋值、
==、!=
7. Nothing 类型
- 类型:
Nothing
- 不包含任何值
- 是所有类型的子类型(包括
Unit)
- 是
break、continue、return、throw 表达式的类型
- 这些表达式之后的代码不可达
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 的加法)
- 包含
start、end(类型 T)、step(Int64,不能为 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 >= end 或 step < 0 && start <= end
start..=end : step 为空:当 step > 0 && start > end 或 step < 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 && x → false |
| ` | | ` |
11.6 位运算符(仅整数类型)
| 运算符 | 说明 |
|---|
!(一元) | 按位取反 |
<< | 左移(低位补 0) |
>> | 右移(无符号补 0;有符号正数补 0,负数补 1) |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
11.7 自增/自减运算符
expr++ / expr-- — 仅后缀,仅整数类型
- 等价于
expr += 1 / expr -= 1
- 结果类型为
Unit(不能用作值)
11.8 合并运算符 ??
- 用于
Option<T> 解包
e1 ?? e2:若 e1 为 Some(v) → v(短路,e2 不求值);若 None → e2
?? 的优先级很低(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。混用时须加括号。