通过阅读 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)
wheresizeof
告诉我们该类型有多少字节。此外,实现定义了一个字节中有多少位。我们大多数人可能习惯于处理 8 位字节,但标准说n
一个字节中有位。
在这篇文章中,Alf P. Steinbach 说:
long 保证(至少)32位。
这违背了我所理解的根据标准在 C++ 中的基本类型的大小。通常我会认为这是一个初学者的错误,但由于这是 Alf,我认为值得进一步调查。
那么,你说什么?标准是否保证 long 至少为 32 位?如果是这样,请具体说明如何做出此保证。我只是没看到。
C++ 标准明确规定,要了解 C++,您必须了解 C (1.2/1) 1
long
C++ 标准隐式定义了 a可以容纳的值的最小限制为LONG_MIN
-LONG_MAX
2
所以无论 along
有多大,它都必须足够大,才能将 LONG_MIN 保持到 LONG_MAX。
但是 Alf 和其他人特别指出 long 必须至少为 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