预定义整数类型

这些整数类型是预定义的:

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 <% bab 视为无符号数并进行比较
a <=% bab 视为无符号数并进行比较

不同类型整型的表达式中,会执行 Automatic type conversion “自动类型转换” ,较小的类型转换为较大的类型。

Automatic type conversion “自动类型转换” 将较大的类型转换为较小的类型(比如 int32 -> int16 ) , widening type conversion “扩大类型转换” 将较小的类型转换为较大的类型(比如int16 -> int32) ,Nim 中仅有扩大类型转型是 隐式的 :

  1. var myInt16 = 5i16
  2. var myInt: int
  3. myInt16 + 34 # 为 `int16` 类型
  4. myInt16 + myInt # 为 `int` 类型
  5. myInt16 + 2i32 # 为 `int32` 类型

然而,如果字面值适合这个较小类型,并且这样的转换比其他隐式转换更好,那么 int 字面值可以隐式转换为较小的整数类型,因而 myInt16 + 34 结果是 int16 类型。

关于细节查看转换关系