猿问

是否保证“ long”至少为32位?

通过阅读C ++标准,我一直了解C ++中不可分割的基本类型的大小如下:


sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

我从3.9.1 / 2推论得出:


有四种有符号整数类型:“ signed char”,“ short int”,“ int”和“ long int”。在此列表中,每种类型提供的存储量至少与列表中位于其前的存储量一样。普通整数具有执行环境的体系结构建议的自然大小

此外,char3.9.1 /将其大小描述为:


足够大,可以存储实现的基本字符集的任何成员。

1.7 / 1对此进行了更具体的定义:


C ++内存模型中的基本存储单元是字节。字节至少大到足以包含基本执行字符集的任何成员,并且由连续的位序列组成,其位数由实现定义。

这使我得出以下结论:


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


因此,无论a long有多大,它都必须足够大以将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


慕尼黑8549860
浏览 602回答 3
3回答

qq_遁去的一_1

C ++使用C标准中定义的限制(C ++:18.3.2(c.limits),C:5.2.4.2.1):LONG_MIN -2147483647 // -(2^31 - 1)LONG_MAX +2147483647 //&nbsp; &nbsp;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位存储。

翻过高山走不出你

答案肯定是。阅读我的OP和所有评论以了解确切原因,但这是简短版本。如果您对此有疑问或疑问,我建议您阅读整个主题和所有评论。否则,请接受以下说法:C ++标准包括C标准的部分,包括用于定义LONG_MIN和LONG_MAXLONG_MIN 定义为不大于 -2147483647LONG_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 intLONG_MIN -2147483647 // -(2 ^ 31 - 1)— maximum value for an object of type long intLONG_MAX +2147483647 // 2 ^ 31 - 11 32位:这并不意味着sizeof (long) >= 4,因为一个字节不一定是8位。根据标准,字节是一些未指定(平台定义)的位数。尽管大多数读者会发现这很奇怪,但实际的硬件CHAR_BIT是16或32。

牛魔王的故事

但是Alf和其他人明确指出long至少必须为32位。这就是我要建立的。C ++标准明确指出未指定字节中的位数。可能是4、8、16、42 ...那么,如何将数字LONG_MIN-LONG_MAX调整为至少32位呢?您需要在值表示形式中使用32位,以便至少获得那么多的位模式。并且由于C ++需要整数的二进制表示(标准中明确的语言,第3.9.1 / 7节),因此QED
随时随地看视频慕课网APP
我要回答