“长”保证至少有32位?
通过阅读C ++标准,我一直认识到C ++中积分基本类型的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
我从3.9.1 / 2推导出来的:
此外, char
的大小被3.9.1 /描述为:
1.7 / 1更具体地定义了这一点:
这使我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
sizeof
告诉我们这个类型有多少个字节。 此外,它是由实现定义的,一个字节中有多少位。 我们中的大多数人可能习惯于处理8位字节,但是标准版说一个字节有n
位。
在这篇文章中,Alf P. Steinbach说:
长保证(至少)32位。
根据标准,这表现在我了解C ++基本类型的大小。 通常情况下,我只是将这种说法折扣为初学者是错误的,但由于这是Alf,我决定进一步调查。
那么,你说什么? 标准长期保证至少32位? 如果是这样,请具体说明如何作出这项保证。 我只是没有看到它。
C ++标准明确指出,为了了解C ++,你必须知道C(1.2 / 1)1
C ++标准隐式定义long
可容纳的值的最小限制为LONG_MIN
- LONG_MAX
2
所以无论多long
,它都必须足够大才能将LONG_MIN保持为LONG_MAX。
但是Alf和其他人特定长期必须至少有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
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
所以你保证一个长度至少是32位。
如果你想遵循长时间的迂回路线来判断LONG_MIN
/ LONG_MAX
是否LONG_MIN
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.
我将脚注移到了注释中,因此它不是标准中出现的内容。 但它基本上意味着std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN
和std::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX
。
因此,尽管C ++标准没有指定(带符号)负数的按位表示,但它必须是二进制补码,并且总共需要32位存储空间,或者它有明确的符号位,这意味着它具有还有32位存储。
答案肯定是。 阅读我的OP和所有评论,以了解为什么,但这里是简短的版本。 如果您对此有任何怀疑或质疑,我鼓励您阅读整个主题和所有评论。 否则,接受这是真实的:
LONG_MIN
和LONG_MAX
的定义 LONG_MIN
被定义为不大于-2147483647
LONG_MAX
被定义为不小于+2147483647
-2147483647
和+2147483647
,你需要32位。 LONG_MAX
表示最小范围LONG_MIN
因此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
1 32位 :这并不意味着sizeof (long) >= 4
,因为一个字节不一定是8位。 根据标准,一个字节是一些未指定的(平台定义的)位数。 虽然大多数读者会发现这很奇怪,但是CHAR_BIT
是16或32的真实硬件。
C ++标准指出<climits>
的内容与C头<limits.h>
(ISO C ++ 03 doc中的18.2.2)相同。
不幸的是,我没有C ++标准的C ++版本(即C90),但在C99(5.2.4.2.1节)中, <limits.h>
必须至少有这个最小值。 我不认为这是从C90改变,除了C99增加了long long
类型。
— 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)
链接地址: http://www.djcxy.com/p/40381.html
上一篇: Is `long` guaranteed to be at least 32 bits?
下一篇: Addressof operator returns invalid address in embedded environment