许多来源,包括Microsoft,将int和long类型都引用为4个字节,并且范围为(带符号)-2,147,483,648到2,147,483,647。如果实际上没有提供更大范围的值,那么拥有一个长基本类型有什么意义呢?
答案 0 :(得分:30)
关于整数类型的唯一保证是:
sizeof(char) == 1
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
sizeof(int) <= sizeof(long)
sizeof(long) <= sizeof(long long)
sizeof(char) * CHAR_BIT >= 8
sizeof(short) * CHAR_BIT >= 16
sizeof(int) * CHAR_BIT >= 16
sizeof(long) * CHAR_BIT >= 32
sizeof(long long) * CHAR_BIT >= 64
其他内容是实现定义的。感谢(4),long
和int
都可以具有相同的大小,但必须至少为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_t
,intptr_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)
我认为它依赖于实现。它们可能会有所不同,但供应商可以提供它们。但是,一些供应商只是简单地使它们在语法上“受支持”(即:你可以将它们放在代码中并且它们将编译,但不会有所不同)。每隔一段时间,您就会遇到这样的语言功能。