仓颉编程语言基础数据类型详解(上)
·
仓颉编程语言基础数据类型详解
一、基本操作符系统
仓颉语言提供了一套丰富而严谨的操作符系统,用于对各种数据类型进行操作和计算。这些操作符按照功能可分为以下几类:
1.1 算术操作符
仓颉支持标准的算术运算操作符:
- 一元负号
-
:对数值取负 - 加法
+
:两数相加 - 减法
-
:两数相减 - 乘法
*
:两数相乘 - 除法
/
:两数相除 - 取余
%
:取两数相除的余数 - 求幂
**
:计算数的幂次方
特点:
- 操作数必须是相同类型
- 结果类型与操作数类型相同
- 除法运算中除数不能为零
- 取余运算仅适用于整数类型
示例:
let a = 10 + 5 // 15 let b = 10 - 5 // 5 let c = 10 * 5 // 50 let d = 10 / 3 // 3 (整数除法) let e = 10 % 3 // 1 let f = 2 ** 3 // 8
1.2 关系操作符
用于比较两个值的大小关系:
- 等于
==
- 不等于
!=
- 小于
<
- 大于
>
- 小于等于
<=
- 大于等于
>=
特点:
- 返回布尔类型结果
- 操作数必须是可比较的类型
- 禁止隐式类型转换
示例:
3 == 3 // true 3 != 4 // true 3 < 4 // true 3 > 4 // false
1.3 逻辑操作符
用于布尔值的逻辑运算:
- 逻辑非
!
:对布尔值取反 - 逻辑与
&&
:两个条件都为真时返回真 - 逻辑或
||
:任一条件为真时返回真
特点:
- 采用短路求值策略
- 操作数必须是布尔类型
- 结果类型为布尔
示例:
!true // false true && false // false true || false // true
1.4 位运算操作符
用于整数类型的位级操作:
- 按位取反
!
- 按位与
&
- 按位或
|
- 按位异或
^
- 左移
<<
- 右移
>>
特点:
- 操作数必须是整数类型
- 移位操作不允许负数移位
- 移位越界会抛出异常
示例:
let a = 0b1010 & 0b1100 // 0b1000 (8) let b = 0b1010 | 0b1100 // 0b1110 (14) let c = 0b1010 ^ 0b1100 // 0b0110 (6) let d = 0b1010 << 2 // 0b101000 (40)
二、整数类型
2.1 整数类型分类
仓颉提供了多种整数类型以适应不同场景需求:
类型 | 位数 | 取值范围 | 说明 |
---|---|---|---|
Int8 | 8 | -128 ~ 127 | 有符号8位整数 |
Int16 | 16 | -32,768 ~ 32,767 | 有符号16位整数 |
Int32 | 32 | -2,147,483,648 ~ 2,147,483,647 | 有符号32位整数 |
Int64 | 64 | -2^63 ~ 2^63-1 | 有符号64位整数 |
IntNative | 平台相关 | 平台相关 | 平台相关有符号整数 |
UInt8 | 8 | 0 ~ 255 | 无符号8位整数 |
UInt16 | 16 | 0 ~ 65,535 | 无符号16位整数 |
UInt32 | 32 | 0 ~ 4,294,967,295 | 无符号32位整数 |
UInt64 | 64 | 0 ~ 2^64-1 | 无符号64位整数 |
UIntNative | 平台相关 | 0 ~ 2^n-1 (n为平台位数) | 平台相关无符号整数 |
2.2 整数字面量
仓颉支持多种进制表示整数:
- 十进制:无前缀,如
123
- 二进制:
0b
或0B
前缀,如0b1010
- 八进制:
0o
或0O
前缀,如0o755
- 十六进制:
0x
或0X
前缀,如0xFF
可使用下划线_
提高可读性:
let decimal = 1_000_000 let binary = 0b1010_1100 let hex = 0xDEAD_BEEF
2.3 整数运算特性
-
溢出处理:
- 默认情况下,整数运算溢出会抛出异常
- 可通过注解指定不同溢出策略:
@OverflowWrapping func add(a: Int8, b: Int8): Int8 { return a + b // 溢出时回绕 }
-
类型转换:
- 必须显式转换不同类型整数
- 窄化转换可能丢失精度
示例:
let a: Int32 = 100 let b: Int64 = a.toInt64() // 显式转换
三、浮点类型
3.1 浮点类型分类
仓颉支持三种精度的浮点数:
类型 | 位数 | 精度 | 范围 | IEEE 754标准 |
---|---|---|---|---|
Float16 | 16 | 约3-4位十进制 | ±6.1×10^-5 ~ ±6.5×10^4 | binary16 |
Float32 | 32 | 约6-7位十进制 | ±1.2×10^-38 ~ ±3.4×10^38 | binary32 |
Float64 | 64 | 约15-16位十进制 | ±2.2×10^-308 ~ ±1.8×10^308 | binary64 |
3.2 浮点字面量
浮点字面量有两种形式:
-
十进制形式:
- 必须包含小数点或指数部分
- 示例:
3.14
,6.02e23
,1e-10
-
十六进制形式:
- 必须包含指数部分(p或P)
- 示例:
0x1.2p3
,0x1.Fp-10
可使用后缀指定类型:
let a = 3.14f32 // Float32 let b = 1.0e10f64 // Float64
3.3 浮点运算特性
-
精度问题:
- 浮点运算可能存在精度损失
- 避免直接比较浮点数相等
// 不推荐 if a == b { ... } // 推荐 if abs(a - b) < epsilon { ... }
-
特殊值:
- 无穷大:
Inf
- 非数字:
NaN
- 可通过静态方法获取:
let inf = Float64.Inf let nan = Float64.NaN
- 无穷大:
-
舍入控制:
- 提供多种舍入模式
- 可通过上下文设置
四、布尔类型
4.1 布尔类型基础
仓颉的布尔类型Bool
只有两个值:
true
:表示逻辑真false
:表示逻辑假
4.2 布尔运算
支持标准逻辑运算:
- 逻辑非
!
- 逻辑与
&&
(短路求值) - 逻辑或
||
(短路求值)
示例:
let a = true let b = false !a // false a && b // false a || b // true
4.3 布尔转换
-
显式转换:
- 与其他类型转换必须显式进行
let b: Bool = true let i: Int = b.toInt() // 1
-
隐式转换:
- 条件表达式必须为布尔类型
if 1 { ... } // 错误:不能隐式转换Int为Bool
五、字符类型
5.1 字符类型基础
仓颉使用Rune
类型表示Unicode字符:
- 支持所有Unicode字符(包括补充平面字符)
- 使用UTF-8编码存储
5.2 字符字面量
三种形式的字符字面量:
- 单字符:
r'a'
,r"中"
- 转义字符:
r'\n'
:换行r'\t'
:制表符r'\\'
:反斜杠
- 通用字符:
r'\u{4F60}'
(表示"你")
5.3 字符操作
-
关系运算:
- 比较Unicode码点
r'a' < r'b' // true
-
类型转换:
- 与UInt32互转
let code = r'A'.toUInt32() // 65 let char = Rune(65) // r'A'
-
字符属性:
- 提供判断字符类别的方法
r'1'.isDigit() // true r'a'.isLetter() // true
六、字符串类型
6.1 字符串基础
仓颉的字符串类型String
:
- 不可变UTF-8编码字符串
- 最大长度4GB
- 支持Unicode全字符集
6.2 字符串字面量
-
单行字符串:
- 双引号或单引号包围
- 支持转义序列
let s1 = "Hello" let s2 = 'World'
-
多行字符串:
- 三重引号包围
- 保留换行和缩进
let poem = """ 床前明月光, 疑是地上霜。 """
-
原始字符串:
- 前缀
r
表示不处理转义
let path = r"C:\Windows\System32"
- 前缀
6.3 字符串操作
-
插值:
- 使用
${}
插入表达式
let name = "Alice" let greeting = "Hello, ${name}!"
- 使用
-
拼接:
- 使用
+
操作符
let s = "Hello" + " " + "World"
- 使用
-
常用方法:
let s = "Hello World" s.length() // 11 s.substring(0, 5) // "Hello" s.indexOf("World") // 6 s.toUpper() // "HELLO WORLD"
-
遍历:
for ch in "Hello" { println(ch) }
6.4 字符串与编码
-
编码转换:
let utf8Bytes = "你好".toUTF8() // 获取UTF-8字节序列 let str = String.fromUTF8(utf8Bytes) // 从字节序列重建字符串
-
编码检测:
let encoding = detectEncoding(bytes) // 检测字节序列编码
结语
仓颉编程语言的基础数据类型系统设计严谨而全面,从精确控制的整数运算到符合IEEE标准的浮点处理,从简洁的布尔逻辑到完整的Unicode字符和字符串支持,每个类型都经过精心设计以满足现代编程需求。理解这些基础数据类型的特性和操作规则,是掌握仓颉编程的关键第一步。在实际开发中,应根据具体场景选择合适的数据类型,并注意各类型的边界条件和特殊值处理,以编写出高效可靠的仓颉代码。
更多推荐
所有评论(0)