包括Microsoft在内的许多来源都将 int 和 long 类型引用为 4 个字节,并且具有(有符号)-2,147,483,648 到 2,147,483,647 的范围。如果长原始类型实际上不提供更大范围的值,那么它有什么意义呢?
8 回答
关于整数类型的唯一保证是:
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))。
long
C++ 标准仅指定至少与 一样大,int
因此当它完全一样大时,在场景中没有任何犯罪:它完全是实现定义的。在不同的平台上,尺寸可能很重要,例如我现在在我的 Linux 机器上int
的尺寸为 4 和long
8。
正如其他人指出的那样,问题背后的假设只是部分正确,即不适用于某些平台。如果你真的想了解我们是如何走到现在这种情况的, 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 位类型)。顺便说一句,添加了 typedef ( intXX_t
, intptr_t
) 以帮助使意图更清晰,intXX_t
但实际上并不需要家族强制恒定大小的风险。
不,在某些平台上只有 4 个字节。C++ 标准将大小保留为实现定义。
在其他平台上,它可能是不同的大小。
它不一定要更大。long
例如,当我在我的机器上使用GCC 时,它通常必须定义为 8 个字节。该标准的措辞通常说这些类型“需要至少为 X 大小”(例如,查看finally-standardized long long
in C++11。
本质上,只要满足要求,任何人都可以自由地做他们想做的事。根据标准,有人可以制作long long
256 位,这是完全合法的。
C++ 语言规范简单地指出 a 的大小long
必须至少是 a 的大小int
。
它曾经是标准的有int
= 2 个字节和long
= 4 个字节。出于某种原因int
,长大并long
保持不变(至少在 Windows 编译器上)。我只能推测出于向后兼容性的原因long
保持不变......
没有人回答你的实际问题,也许除了 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 位整数,还必须在第 16 位而不是第 32 位溢出。因此,使用 32 位 int 会更容易,即使您只有 32 位可以长期使用。
我认为这取决于实现。它们可能会有所不同,但由供应商提供。但是,一些供应商只是简单地使其在语法上得到“支持”(即:您可以将它们放入您的代码中,它们将编译,但没有区别)。每隔一段时间,您就会遇到这样的语言功能。