【发布时间】:2011-05-18 19:17:51
【问题描述】:
通过阅读 C++ 标准,我一直理解 C++ 中整数基本类型的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
我从 3.9.1/2 推断出这个:
- 有四种有符号整数类型:“signed char”、“short int”、 “int”和“long int”。在这份名单中, 每种类型至少提供尽可能多的 存储在它之前的那些 列表。普通整数具有自然大小 建议的架构 执行环境
此外,char 的大小由 3.9.1/ 描述为:
- [...] 大到足以存储实现的基本字符集的任何成员。
1.7/1 更具体地定义了这一点:
- C++ 内存模型中的基本存储单元是字节。一个字节至少大到足以包含基本执行字符集的任何成员,并且由连续的位序列组成,位的数量由实现定义。
这使我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
sizeof 告诉我们该类型有多少字节。此外,实现定义了一个字节中有多少位。我们大多数人可能习惯于处理 8 位字节,但标准说一个字节中有 n 位。
在this post,Alf P. Steinbach 说:
long 保证(至少)32 位。
这与我所理解的 C++ 标准中基本类型的大小完全不同。通常我会认为这是一个错误的初学者,但由于这是 Alf,我认为值得进一步调查。
那么,你说什么?标准是否保证 long 至少为 32 位?如果是这样,请具体说明如何做出此保证。我只是没看到。
C++ 标准明确规定,要了解 C++,您必须了解 C (1.2/1) 1
C++ 标准隐式定义了
long可以容纳的值的最小限制为LONG_MIN-LONG_MAX2
因此,无论long 有多大,它都必须足够大以将 LONG_MIN 保持到 LONG_MAX。
但是 Alf 和其他人特定长必须至少为 32 位。这就是我要建立的。 C++ 标准明确表示未指定字节中的位数(可能是 4、8、16、42)那么连接如何从能够容纳数字LONG_MIN-LONG_MAX 到至少 32 位?
(1) 1.2/1:以下引用文件对于本文件的应用是必不可少的。对于注明日期的参考文献,仅引用的版本适用。对于未注明日期的参考文献,适用参考文件的最新版本(包括任何修订)。
- ISO/IEC 2382(所有部分),信息技术 - 词汇
- ISO/IEC 9899:1999,编程语言 - C
- ISO/IEC 10646-1:2000,信息技术 - 通用多字节编码字符集 (UCS) - 第 1 部分:体系结构和基本多语言平面
(2)在<climits>中定义为:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
【问题讨论】:
-
@Mark:肯定有机器只能处理大于 8 位的数量,例如32 位字,通常使用 char == int == long == 32 位。
-
@Mark Storer:现在不是 8 位的字节很少见,但过去有各种各样的系统。具有 36 位字的计算机将具有 9 位字节。具有 60 位字的旧 CDC Cyber 系统如果有 C 编译器,则必须有 60 位字节(这会导致问题),但通常字符占用 6 位(如果有 6/12 位方案你真的想要小写)。
-
@Mark Storer:德州仪器有一系列带有 C++ 编译器和 16 位字节的 DSP。或者他们曾经有,几年前。还有一个 9 位字节的不合时宜的野兽,祖先可以追溯到中世纪。 “优尼思”?不确定。如果你真的有兴趣,我可以查一下。干杯,
-
好吧,我猜如果有人发明了某种方法来将
(2^32)-1不同的值存储在少于 32 位中,那么很长一段时间内可能不会有 32 位。但是,在任何二进制平台上,只要数学有效,您将拥有 32 位。 -
@Alf:简洁明了。正确,是的,正如本文所示。但是,我建议您确实留下了很多步骤,并且在“C std 中这么说”响应中相当简短。我也没有看到联系,所以我可以理解他的困惑。
标签: c++ standards long-integer language-lawyer