int、nativeint、int64 和 int32 之间有什么区别?

Alp*_*ack 1 ocaml types integer

根据手册,OCaml 有 4 种整数文字:

\n
integer-literal ::= [-]\xe2\x80\x84(0\xe2\x80\xa69)\xe2\x80\x84{\xe2\x80\x840\xe2\x80\xa69\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84_\xe2\x80\x84}\n    \xe2\x88\xa3   \xe2\x80\x84[-]\xe2\x80\x84(0x\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x840X)\xe2\x80\x84(0\xe2\x80\xa69\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84A\xe2\x80\xa6F\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84a\xe2\x80\xa6f) {\xe2\x80\x840\xe2\x80\xa69\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84A\xe2\x80\xa6F\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84a\xe2\x80\xa6f\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84_\xe2\x80\x84}\n    \xe2\x88\xa3   \xe2\x80\x84[-]\xe2\x80\x84(0o\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x840O)\xe2\x80\x84(0\xe2\x80\xa67)\xe2\x80\x84{\xe2\x80\x840\xe2\x80\xa67\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84_\xe2\x80\x84}\n    \xe2\x88\xa3   \xe2\x80\x84[-]\xe2\x80\x84(0b\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x840B)\xe2\x80\x84(0\xe2\x80\xa61)\xe2\x80\x84{\xe2\x80\x840\xe2\x80\xa61\xe2\x80\x84\xe2\x88\xa3\xe2\x80\x84_\xe2\x80\x84}\n \nint32-literal   ::= \xe2\x80\x84integer-literal\xe2\x80\x84l\n \nint64-literal   ::= \xe2\x80\x84integer-literal\xe2\x80\x84L\n \nnativeint-literal   ::= \xe2\x80\x84integer-literal\xe2\x80\x84n\n
Run Code Online (Sandbox Code Playgroud)\n

检查这些文字的类型(使用 utop)给出以下结果:

\n
    \n
  • 123 : int
  • \n
  • 123l : int32
  • \n
  • 123L : int64
  • \n
  • 123n : nativeint
  • \n
\n

int32和 的含义很明显,但是和int64之间有什么区别,它们与显式大小的 32/64 位整数有何关系?intnativeint

\n

gle*_*nsl 7

手册和标准库文档的各个部分对此进行了解释:

\n

整数

\n
\n

整数值是从 \xe2\x88\x922 30到 2 30 \xe2\x88\x921的整数,即 \xe2\x88\x921073741824 到 1073741823。该实现可能支持更广泛的整数值:在 64 位平台上,当前实现支持范围从 \xe2\x88\x922 62到 2 62 \xe2\x88\x921 的整数。

\n
\n

关于与 C 接口的手册部分也为此提供了一些有用的上下文:

\n
\n

value 类型的对象可以是:

\n
    \n
  • 未装箱的整数;
  • \n
  • 或指向堆内块的指针,通过caml_alloc_*第 20.4.4 节中描述的函数之一进行分配。
  • \n
\n
\n
\n

整数值编码 63 位有符号整数(32 位架构上为 31 位)。它们未装箱(未分配)。

\n
\n

由于使用一位来区分未装箱的整数和指针,因此常规ints 要么是 31 位值,要么是 63 位值。

\n

Int32

\n
\n

32 位整数。

\n

该模块提供对int32有符号 32 位整数类型的操作。与内置int类型不同,该类型int32在所有平台上都保证为 32 位宽。所有算术运算int32均以 2 32为模。

\n

性能注意事项: 类型的值int32比 类型的值占用更多的内存空间int,并且 上的算术运算int32通常比 上的算术运算慢intint32仅当应用程序需要精确的 32 位算术时才使用。

\n
\n

Int64

\n
\n

64 位整数。

\n

该模块提供对int64有符号 64 位整数类型的操作。与内置int类型不同,该类型int64保证在所有平台上都是 64 位宽。int64 上的所有算术运算均以 2 64为模

\n

性能注意事项: 类型的值int64比 类型的值占用更多的内存空间int,并且 上的算术运算int64通常比 上的算术运算慢intint64仅当应用程序需要精确的 64 位算术时才使用。

\n
\n

本机int

\n
\n

处理器本机整数。

\n

nativeint该模块提供对有符号 32 位整数(在 32 位平台上)或有符号 64 位整数(在 64 位平台上)类型的操作。该整数类型与 C 编译器中的指针类型具有完全相同的宽度。根据架构的字大小,所有算术运算nativeint均以 2 32或 2 64为模。

\n

性能注意事项: type 的值nativeint比 type 的值占用更多的内存空间int,并且算术运算nativeint通常比 int 慢。nativeint仅当应用程序需要比类型更高的精度时才使用int

\n
\n