为什么C++ int和long类型都是4个字节?

hod*_*smr 18 c++ cpu-architecture

许多来源,包括微软,都将int和long类型都引用为4个字节,并且范围为(带符号)-2,147,483,648到2,147,483,647.如果实际上没有提供更大范围的值,那么拥有长基本类型有什么意义呢?

Gri*_*wes 30

关于整数类型唯一保证的是:

  1. sizeof(char) == 1
  2. sizeof(char) <= sizeof(short)
  3. sizeof(short) <= sizeof(int)
  4. sizeof(int) <= sizeof(long)
  5. sizeof(long) <= sizeof(long long)
  6. sizeof(char) * CHAR_BIT >= 8
  7. sizeof(short) * CHAR_BIT >= 16
  8. sizeof(int) * CHAR_BIT >= 16
  9. sizeof(long) * CHAR_BIT >= 32
  10. sizeof(long long) * CHAR_BIT >= 64

其他的是实现定义.由于(4),二者longint可具有相同的大小,但它必须至少为32位(由于(9)).

  • 有点偏离主题,但对于 C++11,您可以添加 `sizeof(long) &lt;= sizeof(long long)` 和 `sizeof(long long)*CHAR_BIT &gt;= 64`。 (2认同)

Sin*_*all 19

C++标准只规定long至少一样大int,所以没有什么犯罪的情形时,它是完全一样大:它是完全实现定义.在不同的平台上,大小可能很重要,例如我目前在Linux机器上int的大小为4 long,大小为8.


APr*_*mer 9

正如其他人所指出的那样,这个问题背后的假设只是部分正确,即不适用于某些平台.如果你真的想了解我们如何应对目前的情况,由J. Mashey提供的64比特长路将让你对现场的各种力量及其相互作用有一个很好的了解.

快速摘要,C以char(8位)和int(16位)开头.然后添加short(16位)和long(32位),同时int可以是16位或32位,具体取决于平台上的自然和向后兼容的压力.当64位出现时,long long被添加为64位类型,并且在64位平台上的较小类型中进行了一些调整.事情用32位稳定int,但long保留了各种定义,一些64位平台有64位long,而其他(也许只有Windows?)保持long32位,可能是由于向后兼容的压力不同(Unix有很长的假设历史long与指针大小相同,Windows在其API的时间里有更多的残余int是16位,因此long是唯一的32位类型).BTW typedefs(intXX_t,intptr_t)被添加以帮助使意图更清晰,冒着intXX_t家庭强制不变大小的风险,真的不需要.