__int32 与 int 与 int32_t 之间的区别(再次)

Pet*_*nko 1 c++

网络上的答案()只讲述了故事的一部分,并省略了一些我希望您帮助我澄清的细节:

  • 根据 C++ 标准,int 必须 >= 32 位。
  • int默认情况下,不同的编译器(实现)可以分配不同数量的位。所以Compiler A可以int在我声明整数时分配 50 位(例如)。
  • 此外,不同的编译器可能/可能不使用位填充进行优化
  • __int32(Microsoft 特定) 并int32_t在这里解决问题,并且:

我的哪个猜测是正确的?很抱歉再次提出旧问题,但我实际上对所有这些分配功能感到困惑。

在此先感谢您的时间。

eer*_*ika 8

我的哪个猜测是正确的?

  • 根据 C++ 标准,int 必须 >= 32 位。

不正确。int必须 >= 16 位。long必须 >= 32 位。

不同的编译器(实现)可以使 int 分配不同数量的位

正确的。

... 默认情况下。

我不知道具有可配置 int 大小的编译器 - 它通常直接取决于目标架构 - 但我认为这是一种可能性。

此外,不同的编译器可能/可能不使用位填充

他们可能会。他们不需要。

__int32 (Microsoft-specifc) 和 int32_t 是用来解决问题的,并且:

  • 强制编译器准确分配 32 位。

  • 切勿在此数据类型之前/之后使用位填充。

正确的。更具体地说,std::int32_t是其中一种基本类型的别名,它恰好具有 32 位且没有填充。如果编译器没有提供这样的整数类型,那么std::int32_t别名也不会提供。

Microsoft 文档承诺__int32存在并且它是 的另一个名称int,并且它有 32 个非填充位。在其他地方,Microsoft 文档int32_t也是int. 因此,除了__int32不是标准名称之外,没有其他区别。