• 预定义整数类型

    预定义整数类型

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

    • int
    • 通用有符号整数类型;它的大小取决于平台,并且与指针大小相同。 一般应该使用这种类型。 没有类型后缀的整数字面值是这种类型,如果它在 low(int32)… high(int32) 范围内,否则字面值的类型是 int64 。
    • intXX
    • 附加的有符号整数类型的XX位使用此命名方案(例如:int16是16位宽整数)。 当前的实现支持 int8, int16, int32, int64 。 这些类型的字面值后缀为'iXX。
    • uint
    • 通用的 无符号整型 ; 它的大小取决于平台,并且与指针大小相同。 类型后缀为 'u 的整数字面值就是这种类型。
    • uintXX
    • 附加的无符号整数类型的XX位使用此命名方案(例如:uint16是16位宽的无符号整数)。 当前的实现支持 uint8, uint16, uint32, uint64 。 这些类型的字面值具有后缀 'uXX 。 无符号操作被全面封装; 不会导致上溢或下溢。

    除了有符号和无符号整数的常用算术运算符 (+ - * etc.) 之外,还有一些运算符正式处理 整型 整数但将它们的参数视为 无符号: 它们主要用于向后与缺少无符号整数类型的旧版本语言的兼容性。 有符号整数的这些无符号运算使用 % 后缀作为约定:

    操作符含义
    a +% b无符号整型加法
    a -% b无符号整型减法
    a *% b无符号整型乘法
    a /% b无符号整型除法
    a %% b无符号整型取模
    a <% b无符号比较 ab
    a <=% b无符号比较 ab
    ze(a)用零填充 a 的位,直到它具有 int 类型的宽度
    toU8(a)8位无符号转换 a (仍然是 int8 类型)
    toU16(a)16位无符号转换 a (仍然是 int16 类型)
    toU32(a)32位无符号转换 a (仍然是 int32 类型)

    自动类型转换 在使用不同类型的整数类型的表达式中执行:较小的类型转换为较大的类型。

    缩小类型转换 将较大的类型转换为较小的类型(例如 int32 - > int16 。 扩展类型转换 将较小的类型转换为较大的类型(例如 int16 - > int32 )。 Nim中只有扩展类型转型是 隐式的:

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

    但是,如果字面值适合这个较小的类型并且这样的转换比其他隐式转换便宜,则 int 字面值可以隐式转换为较小的整数类型,因此 myInt16 + 34 产生 int16 结果。

    有关详细信息,请参阅 可转换关系 。