Joh*_*ing 50 c++ standards language-lawyer long-integer
通过阅读C++标准,我一直都知道C++中的整数基本类型的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)
我从3.9.1/2中推断出这个:
- 有四种带符号的整数类型:"signed char","short int","int"和"long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.简单的int具有执行环境的体系结构所建议的自然大小
此外,大小char由3.9.1 /描述为:
- [...]大到足以存储实现的基本字符集的任何成员.
1.7/1以更具体的术语定义:
- C++内存模型中的基本存储单元是字节.一个字节至少足以包含基本执行字符集的任何成员,并且由连续的位序列组成,其数量是实现定义的.
这导致我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)
where sizeof告诉我们这个类型的字节数.此外,它是实现定义的字节中有多少位.我们大多数人可能习惯于处理8位字节,但标准表示n字节中有位.
在这篇文章中,Alf P. Steinbach说:
long保证(至少)32位.
根据标准,这一切都在我理解C++基本类型的大小面前.通常情况下,我只是将这句话视为初学者错误,但由于这是Alf,我认为值得进一步调查.
那么,你呢?标准长期保证至少为32位?如果是这样,请具体说明如何进行此保证.我只是没有看到它.
C++标准特别指出,为了了解C++,你必须知道C(1.2/1)1
C++标准隐含地定义了long可容纳的值的最小限制LONG_MIN- LONG_MAX 2
所以无论多大long,它都必须足够大才能将LONG_MIN保持为LONG_MAX.
但Alf和其他人特别指出,long必须至少为32位.这就是我想要建立的.C++标准明确指出一个字节中的位数没有指定(可能是4,8,16,42)那么连接如何能够容纳数字LONG_MIN-LONG_MAX至少为32位?
(1)1.2/1:以下参考文件对于本文件的应用是必不可少的.凡是注日期的引用文件,仅引用的版本适用.凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本标准.
(2)定义<climits>如下:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
Run Code Online (Sandbox Code Playgroud)
MSN*_*MSN 36
C++使用C标准中定义的限制(C++:18.3.2(c.limits),C:5.2.4.2.1):
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
Run Code Online (Sandbox Code Playgroud)
因此,您可以保证长度至少为32位.
如果你想遵循a LONG_MIN/ 是否LONG_MAX可以表示的漫长迂回路线long,你必须看看C++标准中的18.3.1.2(numeric.limits.members):
static constexpr T min() throw(); // Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
static constexpr T max() throw(); // Equivalent to CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, etc.
Run Code Online (Sandbox Code Playgroud)
我将脚注移到评论中,所以它并不完全是标准中出现的内容.但它基本上意味着std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN和std::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX.
因此,即使C++标准没有指定(带符号)负数的按位表示,它也必须是二进制补码并且总共需要32位存储,或者它有一个显式符号位,这意味着它具有32位存储也.
Joh*_*ing 16
答案肯定是肯定的.阅读我的OP和所有评论,以了解原因,但这是短版本.如果您怀疑或质疑这一点,我建议您阅读整个主题和所有评论.否则接受此为真:
LONG_MIN和LONG_MAXLONG_MIN 被定义为不大于 -2147483647 LONG_MAX 被定义为不低于 +2147483647 -2147483647和+2147483647二进制,您需要32位.LONG_MIN通过LONG_MAX因此,a long必须至少为32位1.
LONG_MIN并且LONG_MAX在第5.2.4.2.1节中具有C标准(ISO/IEC 9899:TC3)规定的数值:
[......]它们的实施定义值的大小[...](绝对值)应与所示值相等或更大,具有相同的符号[...]
— minimum value for an object of type long int
LONG_MIN -2147483647 // -(2 ^ 31 - 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2 ^ 31 - 1
Run Code Online (Sandbox Code Playgroud)
1 32位:这并不意味着sizeof (long) >= 4,因为一个字节不一定是8位.根据标准,字节是一些未指定的(平台定义的)位数.虽然大多数读者会觉得这很奇怪,但真正的硬件CHAR_BIT是16或32.
C++标准指出其内容<climits>与C头<limits.h>(ISO C++ 03 doc中的18.2.2)相同.
不幸的是,我没有C++ 98之前存在的C标准的副本(即C90),但是在C99(第5.2.4.2.1节)中,<limits.h>必须至少具有这个最小值.除了C99添加long long类型之外,我不认为这改变了C90 .
— minimum value for an object of type long int
LONG_MIN -2147483647 // ?(2^31 ? 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2^31 ? 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 2^32 ? 1
— minimum value for an object of type long long int
LLONG_MIN -9223372036854775807 // ?(2^63? 1)
Run Code Online (Sandbox Code Playgroud)
但Alf和其他人特别指出,long必须至少为32位.这就是我想要建立的.C++标准明确指出未指定字节中的位数.可能是4,8,16,42 ......那么如何能够容纳LONG_MIN-LONG_MAX数字至少为32位?
在值表示中需要32位才能获得至少那么多位模式.并且因为C++需要整数的二进制表示(在标准中使用显式语言,§3.9.1/ 7),QED
是的,C++标准明确指出未指定字节中的位数.也没有指定long中的位数.
设置数字的下限不指定它.
C++标准在一个地方说:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).
Run Code Online (Sandbox Code Playgroud)
它实际上是通过包含C标准在另一个地方说的:
CHAR_BITS >= 8; SHORT_BITS >= 16; INT_BITS >= 16; LONG_BITS >= 32
Run Code Online (Sandbox Code Playgroud)
(除了AFAIK,标识符SHORT_BITS,INT_BITS和LONG_BITS不存在,并且这些限制是由类型的最小值要求推断的.)
这是因为在数学上需要一定数量的比特来编码(例如,对于长)LONG_MIN..LONG_MAX范围中的所有值.
最后,短裤,整体和长头必须全部由多个字符组成; sizeof()始终报告一个整数值.此外,通过char迭代内存char必须访问每一位,这带来了一些实际限制.
这些要求在任何方面都不一致.任何满足要求的尺寸都可以.
很久以前有机器的原始字大小为36位.如果你要将C++编译器移植到它们,你可以合法地决定在一个char中有9位,在short和int中有18位,在long中有36位.您也可以在法律上决定在每种类型中使用36位,原因与今天在典型32位系统上的int中可以有32位相同.有些实际的实现使用64位字符.
另请参阅C++ FAQ Lite的第26.1-6和29.5节.