预定义整数类型
这些整数类型是预定义的:
int
常规有符号整数类型,其大小与平台有关,并与指针的大小相同。
一般情况下应该使用这种类型。 一个没有类型后缀的整数字面量,如果在 low(int32)..high(int32) 范围内,就属于这种类型,否则该字面量的类型是 int64 。
intXX
这种命名规则,是有符号整数类型附带 XX 表示位宽(例如: int16 是 16 位宽的整数)。
目前支持 int8 int16 int32 int64 ,这些类型的字面值后缀为 ‘iXX 。
uint
常规的 unsigned integer “无符号整数”类型的大小与平台有关,与指针的大小相同,整数字面值后缀为 ‘u 。
uintXX
这种命名规则,是无符号整数类型附带 XX ,表示位宽(例如: uint16 是 16 位宽的无符号整数),目前支持 uint8 uint16 uint32 uint64 ,字面值后缀为 ‘uXX’ 。无符号运算会环绕,不会导致溢出或下溢的错误。
除了有符号和无符号整数的常用算术运算符( + - * 等)之外, 还有些运算符可以处理 有符号 整数,但将其参数视为 无符号 ,主要用于之后的版本与缺少无符号整数类型的旧版本语言进行兼容。有符号整数的这些无符号运算,约定使用 % 作为后缀:
操作符 | 含义 |
---|---|
a +% b | 无符号整数加 |
a -% b | 无符号整数减 |
a *% b | 无符号整数乘 |
a /% b | 无符号整数除 |
a %% b | 无符号整数模 |
a <% b | 将 a 和 b 视为无符号数并进行比较 |
a <=% b | 将 a 和 b 视为无符号数并进行比较 |
不同类型整型的表达式中,会执行 Automatic type conversion “自动类型转换” ,较小的类型转换为较大的类型。
Automatic type conversion “自动类型转换” 将较大的类型转换为较小的类型(比如 int32 -> int16 ) , widening type conversion “扩大类型转换” 将较小的类型转换为较大的类型(比如int16 -> int32) ,Nim 中仅有扩大类型转型是 隐式的 :
var myInt16 = 5i16
var myInt: int
myInt16 + 34 # 为 `int16` 类型
myInt16 + myInt # 为 `int` 类型
myInt16 + 2i32 # 为 `int32` 类型
然而,如果字面值适合这个较小类型,并且这样的转换比其他隐式转换更好,那么 int 字面值可以隐式转换为较小的整数类型,因而 myInt16 + 34 结果是 int16 类型。
关于细节查看转换关系。