跳到主要内容

整数类型

整数类型分为有符号(signed)整数类型和无符号(unsigned)整数类型。

有符号整数类型包括 Int8Int16Int32Int64IntNative,分别用于表示编码长度为 8-bit16-bit32-bit64-bit 和平台相关大小的有符号整数值的类型。

无符号整数类型包括 UInt8UInt16UInt32UInt64UIntNative,分别用于表示编码长度为 8-bit16-bit32-bit64-bit 和平台相关大小的无符号整数值的类型。

对于编码长度为 N 的有符号整数类型,其表示范围为:2N12N11-2^{N-1} \sim 2^{N-1}-1;对于编码长度为 N 的无符号整数类型,其表示范围为:02N10 \sim 2^{N}-1。下表列出了所有整数类型的表示范围:

类型表示范围
Int827271(128127)-2^7 \sim 2^7-1 (-128 \sim 127)
Int162152151(32,76832,767)-2^{15} \sim 2^{15}-1 (-32,768 \sim 32,767)
Int322312311(2,147,483,6482,147,483,647)-2^{31} \sim 2^{31}-1 (-2,147,483,648 \sim 2,147,483,647)
Int642632631(9,223,372,036,854,775,8089,223,372,036,854,775,807)-2^{63} \sim 2^{63}-1 (-9,223,372,036,854,775,808 \sim 9,223,372,036,854,775,807)
IntNativeplatform dependent
UInt80281(0255)0 \sim 2^8-1 (0 \sim 255)
UInt1602161(065,535)0 \sim 2^{16}-1 (0 \sim 65,535)
UInt3202321(04,294,967,295)0 \sim 2^{32}-1 (0 \sim 4,294,967,295)
UInt6402641(018,446,744,073,709,551,615)0 \sim 2^{64}-1 (0 \sim 18,446,744,073,709,551,615)
UIntNativeplatform dependent

程序具体使用哪种整数类型,取决于该程序中需要处理的整数的性质和范围。在 Int64 类型适合的情况下,首选 Int64 类型,因为 Int64 的表示范围足够大,并且整数类型字面量在没有类型上下文的情况下默认推断为 Int64 类型,可以避免不必要的类型转换。同时,仓颉编程语言中的 IntNativeUIntNative,分别为有符号和无符号整数类型,提供与当前系统一致的位宽长度。这意味二者大小取决于运行它们的平台,使得其在跨平台开发中能够自动适应系统的位宽。

整数类型字面量

整数类型字面量有 4 种进制表示形式:二进制(使用 0b0B 前缀)、八进制(使用 0o0O 前缀)、十进制(没有前缀)、十六进制(使用 0x0X 前缀)。例如,对于十进制数 24,表示成二进制是 0b00011000(或 0B00011000),表示成八进制是 0o30(或 0O30),表示成十六进制是 0x18(或 0X18)。

在各进制表示中,可以使用下划线 _ 充当分隔符的作用,方便识别数值的位数,如 0b0001_1000

对于整数类型字面量,如果它的值超出了上下文要求的整数类型的表示范围,编译器将会报错。

let x: Int8 = 128          // Error, 128 out of the range of Int8
let y: UInt8 = 256 // Error, 256 out of the range of UInt8
let z: Int32 = 0x8000_0000 // Error, 0x8000_0000 out of the range of Int32

在使用整数类型字面量时,可以通过加入后缀来明确整数字面量的类型,后缀与类型的对应为:

后缀类型后缀类型
i8Int8u8UInt8
i16Int16u16UInt16
i32Int32u32UInt32
i64Int64u64UInt64

加入了后缀的整数字面量可以通过以下方式使用:

var x = 100i8  // x is 100 with type Int8
var y = 0x10u64 // y is 16 with type UInt64
var z = 0o432i32 // z is 282 with type Int32

字符字节字面量

仓颉编程语言支持字符字节字面量,以方便使用 ASCII 码表示 UInt8 类型的值。字符字节字面量由字符 b、一对标识首尾的单引号、以及一个 ASCII 字符组成,例如:

main(): Unit {
var a = b'x' // a is 120 with type UInt8
var b = b'\n' // b is 10 with type UInt8
var c = b'\u{78}' // c is 120 with type UInt8
c = b'\u{90}' - b'\u{66}' + c // c is 162 with type UInt8
}

b'x' 表示类型为 UInt8 大小是 120 的字面值。另外还可以通过 b'\u{78}' 这种转义形式表示类型为 UInt8,16 进制大小为 0x78 或 10 进制大小为 120 的字面值。需要注意的是,\u 内部最多有两位 16 进制数,并且值必须小于 256(十进制)。

整数类型支持的操作

整数类型默认支持的操作符包括:算术操作符、位操作符、关系操作符、自增和自减操作符、复合赋值操作符。各操作符的优先级参见附录中的操作符

整数类型之间、整数类型和浮点类型之间可以互相转换,整数类型可以转换为字符类型,具体的类型转换语法及规则请参见数值类型之间的转换

注意:

本章所提及的某个类型支持的操作,均是指在没有操作符重载的前提下。