C++ int_least64_t vs int_fast64_t vs int64_t

C++ int_least64_t vs int_fast64_t vs int64_t,c++,int,64-bit,C++,Int,64 Bit,我正在尝试将代码移植到64位 我发现C++提供了64位整数类型,但我还是困惑了。 首先,我发现了四个不同的64位ints: int_least64_t int_fast64_t int64_t intmax_t 和他们未签字的同行。我使用sizeof()测试了它们,它们是8字节,所以是64位 他们之间有什么不同?least和fast类型的含义是什么?那么intmax\u t呢?在您的平台上,它们都是相同基础数据类型的名称。在其他平台上,情况并非如此 int64\t要求正好是64位。在具有(例如

我正在尝试将代码移植到64位

<>我发现C++提供了64位整数类型,但我还是困惑了。 首先,我发现了四个不同的64位
int
s:

int_least64_t
int_fast64_t
int64_t
intmax_t
和他们未签字的同行。我使用
sizeof()
测试了它们,它们是8字节,所以是64位


他们之间有什么不同?
least
fast
类型的含义是什么?那么
intmax\u t
呢?

在您的平台上,它们都是相同基础数据类型的名称。在其他平台上,情况并非如此

int64\t
要求正好是64位。在具有(例如)9位字节的体系结构上,它根本不可用

int\u least64\u t
是最小的数据类型,至少有64位。如果
int64\t
可用,将使用它。但是(例如)对于9位字节机器,这可能是72位

int\u fast64\t
是至少具有64位且具有最佳算术性能的数据类型。它主要用于与
int\u fast8\u t
int\u fast16\u t
的一致性,在许多机器上,它们将是32位,而不是8位或16位。再过几年,可能会有一种128位数学比64位更快的体系结构,但我认为现在还不存在这种体系结构



如果要移植算法,可能需要使用
int\u fast32\u t
,因为它将保存旧32位代码可以处理的任何值,但如果速度更快,它将是64位。如果要将指针转换为整数(为什么?)。它可能不是为所有平台定义的

int至少为64位的最小类型

int\u fast64\t
是处理速度最快的类型,至少有64位


在32位或64位处理器上,它们都将被定义,并且都具有64位。在一个假设的73位处理器上,
int64\t
将不会被定义(因为没有具有精确64位的类型),而其他类型将具有73位。

这些typedef值得了解,但您确定您看到的是正确的问题吗?“移植到64位”通常不需要更改类型。在最好的情况下,您只需重新编译。@KerrekSB:很好。我已经更新了我的答案来解决这个问题。可能重复“在(例如)具有9位字节的体系结构上,它将根本不可用。”也许值得一提的是,
intN\u t
(作为C90的扩展)的原始POSIX定义允许填充,所以你可以有一个72位的
int64_t
,其中8位用于填充。如果我错了请纠正我:关于int64_t,如果我有一个8位的平台,它将被定义,如果我有其他不是64位的平台,它将不被定义,可以吗;关于int_least64_t:仅当我有至少64位平台或大于64位平台时,它才会定义,但如果平台小于64位,它不会定义,这是真的吗?在最后一个int\u fast64\u t是默认值,例如,如果我有一个64位平台,它将被定义为_int64if i,依此类推,但条件是至少是8位体系结构,谢谢。@user722528:要有
int64\u t
,64位必须能被基本内存单位(一个字节)整除。因此,对于8位字节,它将存在,但对于16位字节也是如此。或4位字节。如果字节为8位,则仍然可能(尽管不太可能)不存在64位类型,在这种情况下,将不定义
int64\t
。和4位字节是不允许的<代码>字符位必须至少为8。@BenVoigt+1是一个很好的答案。我只是想知道,理论上,如果要将
int8\t
传递给一个使用参数但不执行任何算术(例如,参数用作数组索引)的方法,因此,传递
int8\u t
比传递
int\u fast8\u t
更好,这样可以节省将额外的24位复制到堆栈所需的时间吗?