仓颉编程语言基础数据类型详解

一、基本操作符系统

仓颉语言提供了一套丰富而严谨的操作符系统,用于对各种数据类型进行操作和计算。这些操作符按照功能可分为以下几类:

1.1 算术操作符

仓颉支持标准的算术运算操作符:

  • 一元负号 -:对数值取负
  • 加法 +:两数相加
  • 减法 -:两数相减
  • 乘法 *:两数相乘
  • 除法 /:两数相除
  • 取余 %:取两数相除的余数
  • 求幂 **:计算数的幂次方

特点

  1. 操作数必须是相同类型
  2. 结果类型与操作数类型相同
  3. 除法运算中除数不能为零
  4. 取余运算仅适用于整数类型

示例:

 
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 关系操作符

用于比较两个值的大小关系:

  • 等于 ==
  • 不等于 !=
  • 小于 <
  • 大于 >
  • 小于等于 <=
  • 大于等于 >=

特点

  1. 返回布尔类型结果
  2. 操作数必须是可比较的类型
  3. 禁止隐式类型转换

示例:

 
3 == 3 // true 3 != 4 // true 3 < 4 // true 3 > 4 // false 

1.3 逻辑操作符

用于布尔值的逻辑运算:

  • 逻辑非 !:对布尔值取反
  • 逻辑与 &&:两个条件都为真时返回真
  • 逻辑或 ||:任一条件为真时返回真

特点

  1. 采用短路求值策略
  2. 操作数必须是布尔类型
  3. 结果类型为布尔

示例:

 
!true // false true && false // false true || false // true 

1.4 位运算操作符

用于整数类型的位级操作:

  • 按位取反 !
  • 按位与 &
  • 按位或 |
  • 按位异或 ^
  • 左移 <<
  • 右移 >>

特点

  1. 操作数必须是整数类型
  2. 移位操作不允许负数移位
  3. 移位越界会抛出异常

示例:

 
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
  • 二进制:0b0B前缀,如 0b1010
  • 八进制:0o0O前缀,如 0o755
  • 十六进制:0x0X前缀,如 0xFF

可使用下划线_提高可读性:

 
let decimal = 1_000_000 let binary = 0b1010_1100 let hex = 0xDEAD_BEEF 

2.3 整数运算特性

  1. 溢出处理

    • 默认情况下,整数运算溢出会抛出异常
    • 可通过注解指定不同溢出策略:
       
      @OverflowWrapping func add(a: Int8, b: Int8): Int8 { return a + b // 溢出时回绕 } 
  2. 类型转换

    • 必须显式转换不同类型整数
    • 窄化转换可能丢失精度

示例:

 
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 浮点字面量

浮点字面量有两种形式:

  1. 十进制形式

    • 必须包含小数点或指数部分
    • 示例:3.14, 6.02e23, 1e-10
  2. 十六进制形式

    • 必须包含指数部分(p或P)
    • 示例:0x1.2p3, 0x1.Fp-10

可使用后缀指定类型:

 
let a = 3.14f32 // Float32 let b = 1.0e10f64 // Float64 

3.3 浮点运算特性

  1. 精度问题

    • 浮点运算可能存在精度损失
    • 避免直接比较浮点数相等
     
    // 不推荐 if a == b { ... } // 推荐 if abs(a - b) < epsilon { ... } 
  2. 特殊值

    • 无穷大:Inf
    • 非数字:NaN
    • 可通过静态方法获取:
     
    let inf = Float64.Inf let nan = Float64.NaN 
  3. 舍入控制

    • 提供多种舍入模式
    • 可通过上下文设置

四、布尔类型

4.1 布尔类型基础

仓颉的布尔类型Bool只有两个值:

  • true:表示逻辑真
  • false:表示逻辑假

4.2 布尔运算

支持标准逻辑运算:

  1. 逻辑非 !
  2. 逻辑与 &&(短路求值)
  3. 逻辑或 ||(短路求值)

示例:

 
let a = true let b = false !a // false a && b // false a || b // true 

4.3 布尔转换

  1. 显式转换

    • 与其他类型转换必须显式进行
     
    let b: Bool = true let i: Int = b.toInt() // 1 
  2. 隐式转换

    • 条件表达式必须为布尔类型
     
    if 1 { ... } // 错误:不能隐式转换Int为Bool 

五、字符类型

5.1 字符类型基础

仓颉使用Rune类型表示Unicode字符:

  • 支持所有Unicode字符(包括补充平面字符)
  • 使用UTF-8编码存储

5.2 字符字面量

三种形式的字符字面量:

  1. 单字符r'a', r"中"
  2. 转义字符
    • r'\n':换行
    • r'\t':制表符
    • r'\\':反斜杠
  3. 通用字符r'\u{4F60}'(表示"你")

5.3 字符操作

  1. 关系运算

    • 比较Unicode码点
     
    r'a' < r'b' // true 
  2. 类型转换

    • 与UInt32互转
     
    let code = r'A'.toUInt32() // 65 let char = Rune(65) // r'A' 
  3. 字符属性

    • 提供判断字符类别的方法
     
    r'1'.isDigit() // true r'a'.isLetter() // true 

六、字符串类型

6.1 字符串基础

仓颉的字符串类型String

  • 不可变UTF-8编码字符串
  • 最大长度4GB
  • 支持Unicode全字符集

6.2 字符串字面量

  1. 单行字符串

    • 双引号或单引号包围
    • 支持转义序列
     
    let s1 = "Hello" let s2 = 'World' 
  2. 多行字符串

    • 三重引号包围
    • 保留换行和缩进
     
    let poem = """ 床前明月光, 疑是地上霜。 """ 
  3. 原始字符串

    • 前缀r表示不处理转义
     
    let path = r"C:\Windows\System32" 

6.3 字符串操作

  1. 插值

    • 使用${}插入表达式
     
    let name = "Alice" let greeting = "Hello, ${name}!" 
  2. 拼接

    • 使用+操作符
     
    let s = "Hello" + " " + "World" 
  3. 常用方法

     
    let s = "Hello World" s.length() // 11 s.substring(0, 5) // "Hello" s.indexOf("World") // 6 s.toUpper() // "HELLO WORLD" 
  4. 遍历

     
    for ch in "Hello" { println(ch) } 

6.4 字符串与编码

  1. 编码转换

     
    let utf8Bytes = "你好".toUTF8() // 获取UTF-8字节序列 let str = String.fromUTF8(utf8Bytes) // 从字节序列重建字符串 
  2. 编码检测

     
    let encoding = detectEncoding(bytes) // 检测字节序列编码 

结语

仓颉编程语言的基础数据类型系统设计严谨而全面,从精确控制的整数运算到符合IEEE标准的浮点处理,从简洁的布尔逻辑到完整的Unicode字符和字符串支持,每个类型都经过精心设计以满足现代编程需求。理解这些基础数据类型的特性和操作规则,是掌握仓颉编程的关键第一步。在实际开发中,应根据具体场景选择合适的数据类型,并注意各类型的边界条件和特殊值处理,以编写出高效可靠的仓颉代码。

 

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐