根据我对C++标准的阅读,我始终理解C++中整数基本类型的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
我从3.9.1/2中推断出以下结论:
- 有四种带符号整数类型:“signed char”,“short int”,“int”和“long int”。在此列表中, 每个类型提供的存储空间至少与在列表中其前面的类型一样多。普通的int类型具有由执行环境的体系结构建议的自然大小。
而且,3.9.1/中描述了char
的大小:
- [...]足够大以存储实现的基本字符集中的任何成员。
1.7/1更明确地定义了这个概念:
- C++内存模型的基本存储单元是字节。一个字节至少足以包含基本执行字符集的任何成员,并由一系列连续的位组成,其数量是实现定义的。
这使我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
sizeof
能告诉我们类型占用的字节数,但实现定义了每个字节占用的位数。大多数人可能习惯于处理8位字节,但标准规定每字节有个位。在此帖子中,Alf P. Steinbach说:
long至少保证为32位。
这与我对C++中基本类型大小详细了解的所有内容相矛盾。通常,我会将这种陈述视为新手的错误,但由于这是Alf说的,所以我决定进一步调查。
那么,你怎么看? 标准保证
long
至少为32位吗? 如果是,请具体说明如何做出此保证。 我就是看不到。- C++标准明确表示,要了解C ++,必须了解C(1.2 / 1)。
- C ++标准隐含地定义了可容纳
long
的值的最小限制为LONG_MIN
-LONG_MAX
。
long
多大,它都必须足够大,以容纳LONG_MIN到 LONG_MAX 。但Alf和其他人明确表示,long至少必须为32位。这就是我要证实的。C++标准明确指出,字节中的位数没有指定(可能是4、8、16或42)。那么从能容纳LONG_MIN-LONG_MAX
到至少32位之间如何建立联系?LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
(2^32)-1
个不同的值,那么long类型可能就不会有32位了。然而,在任何二进制平台上,只要数学是有效的,你都会有32位。 - Anon.