3 回答
TA贡献1725条经验 获得超7个赞
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
因此,可以确保long至少为32位。
而且,如果您想沿着漫长的路线了解LONG_MIN/ 是否LONG_MAX可以用a表示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位存储。
TA贡献1875条经验 获得超3个赞
答案肯定是。阅读我的OP和所有评论以了解确切原因,但这是简短版本。如果您对此有疑问或疑问,我建议您阅读整个主题和所有评论。否则,请接受以下说法:
C ++标准包括C标准的部分,包括用于定义LONG_MIN和LONG_MAX
LONG_MIN 定义为不大于 -2147483647
LONG_MAX 被定义为不小于 +2147483647
在C ++中,整数类型以二进制形式存储在基础表示中
为了表示-2147483647和+2147483647二进制,则需要32位。
A C ++长被保证是能够代表最小范围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
1 32位:这并不意味着sizeof (long) >= 4,因为一个字节不一定是8位。根据标准,字节是一些未指定(平台定义)的位数。尽管大多数读者会发现这很奇怪,但实际的硬件CHAR_BIT是16或32。
TA贡献1830条经验 获得超3个赞
但是Alf和其他人明确指出long至少必须为32位。这就是我要建立的。C ++标准明确指出未指定字节中的位数。可能是4、8、16、42 ...那么,如何将数字LONG_MIN-LONG_MAX调整为至少32位呢?
您需要在值表示形式中使用32位,以便至少获得那么多的位模式。并且由于C ++需要整数的二进制表示(标准中明确的语言,第3.9.1 / 7节),因此QED
- 3 回答
- 0 关注
- 601 浏览
添加回答
举报