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

时间:2012-11-15 13:38:43

标签: c++ cpu-architecture

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

8 个答案:

答案 0 :(得分: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
  11. 其他内容是实现定义的。感谢(4),longint都可以具有相同的大小,但必须至少为32位(感谢(9))。

答案 1 :(得分:19)

C ++标准仅指定long 至少与int一样大,因此在完全一样大的情况下,没有任何罪恶:它完全是实现定义的。在不同的平台上,大小可能很重要,例如我的Linux机器上目前大小为4 int且大小为long

答案 2 :(得分:9)

正如其他人所指出的那样,这个问题背后的假设只是部分正确,即不适用于某些平台。如果你真的想了解我们如何应对目前的情况,J。Mashey的the Long Road to 64 Bits会让你对存在的各种力量及其相互作用有很好的了解。

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

答案 3 :(得分:3)

不,在某些平台上只有4个字节。 C ++标准将大小保留为实现定义。

在其他平台上,它的大小可能不同。

答案 4 :(得分:3)

它不一定必须更大。例如,当我在我的机器上使用GCC时,通常将long定义为8字节。标准的措辞通常表示这些类型“必须至少为X大小”(例如,请查看finally-standardized long long in C++11

基本上,只要满足要求,任何人都可以自由地做他们想要的事情。根据该标准,有人可以使long long 256位,并且它是完全合法的。

答案 5 :(得分:3)

C ++语言规范只是说明long的大小必须至少是int的大小。

以前是int = 2个字节和long = 4个字节的标准。出于某种原因int长大,long保持不变(至少在Windows编译器上)。我只能推测long由于向后兼容性而保持相同

答案 6 :(得分:1)

除了AProgrammer之外,没有人回答你的实际问题。

C / C ++标准定义为Griwes描述的。这允许实现C和C ++语言,其中编译器供应商可以定义最方便计算机体系结构的大小。有一段时间,(对于Windows 3.1及之前,即Windows 95之前),Windows的C代码有16位int,而许多UNIX平台,如Solaris,HPUX和AIX有32位int。

然而,现代微型计算机(自386起)具有完整的32位寄存器,并且寻址存储器与32位对齐比访问16位增量要快得多。因此,对于32位int,代码的效率要高得多,特别是对于int数组,而不是16位int。

要模拟32位寄存器中的16位int,还必须在第16位溢出,而不是在第32位溢出。所以使用32位int会更容易,即使你只有32位可用。

答案 7 :(得分:0)

我认为它依赖于实现。它们可能会有所不同,但供应商可以提供它们。但是,一些供应商只是简单地使它们在语法上“受支持”(即:你可以将它们放在代码中并且它们将编译,但不会有所不同)。每隔一段时间,您就会遇到这样的语言功能。