许多来源(包括Microsoft)都将int和long类型都引用为4字节,并且范围为(有符号)-2,147,483,648至2,147,483,647。那么,如果long原始类型实际上没有提供更大的值范围,它的意义是什么呢?
许多来源(包括Microsoft)都将int和long类型都引用为4字节,并且范围为(有符号)-2,147,483,648至2,147,483,647。那么,如果long原始类型实际上没有提供更大的值范围,它的意义是什么呢?
关于整数类型的唯一保证是:
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))。
sizeof(long) <= sizeof(long long)
和 sizeof(long long)*CHAR_BIT >= 64
。 - Mike SeymourINT_MAX
和INT_MIN
等需要至少32位。这仍然在答案中。 - GriwesC++标准只规定long
至少与int
一样大,因此当其 恰好与int
一样大的情况下没有任何问题:这完全取决于实现。在不同的平台上,大小可能会有所不同,例如我目前在我的Linux机器上有大小为4的int
和大小为8的long
。
正如其他人指出的那样,该问题的假设只部分成立,即在某些平台上不成立。如果您真的想了解我们是如何走到当前的情况的,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?)将long
保持为32位,可能是由于向后兼容性的不同压力(Unix有一个长期假设long
与指针大小相同,Windows在其API中仍有更多的遗留物来自于int
为16位时的时间,因此long
是唯一的32位类型)。BTW typedefs(intXX_t
,intptr_t
)被添加以帮助使意图更清晰,但intXX_t
族可能会强制使用常数大小,但实际上并不需要。
CHAR_BIT
,您可以推断出最小大小。 - Steve Jessoplong
定义为8个字节。标准的措辞通常说这些类型“至少需要X大小”(例如,请查看C++11中最终规范化的long long
)。long long
设置为256位,并且它是完全合法的。long
类型的大小至少要与int
相同。曾经标准的做法是让int
占用2个字节,而long
占用4个字节。由于某种原因,int
变大了,而long
保持不变(至少在Windows编译器中是这样)。我只能猜测long
之所以保持不变,是为了向后兼容。请注意,本文中出现的HTML标签已被保留。除了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的代码比使用16位int的代码更有效率,特别是对于int数组。
为了在32位寄存器中模拟16位int,您还必须在第16位上溢出,而不是第32位。因此,即使您只有32位可用于long,使用32位int也更容易。
我认为这取决于具体的实现。它们可能会有所不同,但供应商负责提供它们。然而,有些供应商只是让它们在语法上“支持”(即:你可以将它们放入代码中并编译通过,但没有区别)。偶尔会遇到这样的语言特性。
int
占32位,而long long
占64位。那么在两者之间选择多少位作为long
的大小?在历史上,Windows 上的long
大小一直保持在32位,因为在 Windows 上int
的大小是16位。我模糊地怀疑 Windows 95 是第一个使用32位int
的版本,但当时我还没有开始使用 C 进行编程,所以不确定。 - Steve Jessopsizeof == 1
是完全可以的。这也会证明std::vector<bool>
是正确的! - Kerrek SBunsigned char
的每个值都不能在int
中表示,那么像getc
、tolower
这样的东西就会出现问题。这将无法区分EOF
和(int)UCHAR_MAX
,或者对这些值调用字符函数。 - Steve Jessop