“长”保证至less有32位?
通过阅读C ++标准,我一直认识到C ++中积分基本types的大小如下:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
我从3.9.1 / 2推导出来的:
- 有四个有符号整数types:“signed char”,“short int”,“int”和“long int”。在这个列表中,每个types至less提供与列表中的前一个types相同的存储。 Plain int具有执行环境的体系结构所build议的自然大小
此外, char
的大小被3.9.1 /描述为:
- 足够大以存储实现的基本字符集的任何成员。
1.7 / 1从更具体的angular度对此进行了定义:
- C + +内存模型中的基本存储单元是字节。 一个字节至less足够大以包含基本执行字符集的任何成员,并且由一个连续的位序列组成,其数目是由实现定义的。
这使我得出以下结论:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
sizeof
告诉我们这个types有多less个字节。 而且,实现定义了多less位在一个字节中。 我们中的大多数人可能习惯于处理8位字节,但标准中说有一个字节有n
位。
在这篇文章中 ,Alf P. Steinbach说:
长保证(至less)32位。
这在一切我都了解的基础types的大小在C ++根据标准的苍蝇。 通常情况下,我只是将这个陈述折扣为初学者是错误的,但是因为这是Alf,我决定进一步调查。
那么,你说什么? 标准的长期保证是至less32位? 如果是这样,请具体说明如何作出这项保证。 我只是没有看到它。
-
C ++标准专门说,为了了解C ++,你必须知道C(1.2 / 1) 1
-
C ++ Standard隐含地定义了一个
long
可以容纳的值的最小限制是LONG_MIN
–LONG_MAX
2
所以不pipe多long
,都要把LONG_MIN变成LONG_MAX。
但是Alf和其他人特定的是,一个长的必须是至less32位。 这是我想要build立的。 C ++标准明确指出一个字节中的位数没有被指定(它可能是4,8,16,42)那么连接是如何能够容纳数字LONG_MIN-LONG_MAX
到至less32位?
(1)1.2 / 1:以下参考文件对于本文件的应用是必不可less的。 凡是注date的引用文件,仅注明引用的版本。 凡是不注date的引用文件,其最新版本(包括所有的修改单)适用于本文件。
- 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
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
所以你保证一个长度至less是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和所有的意见,以了解为什么,但这里的简短版本。 如果您怀疑或质疑这一切,我鼓励您阅读整个主题和所有评论。 否则,接受这个为真:
- C ++标准包含C标准的一部分,包括
LONG_MIN
和LONG_MAX
的定义 -
LONG_MIN
被定义为不大于-2147483647
-
LONG_MAX
被定义为不小于+2147483647
- 在C ++中,整型types以二进制forms存储在底层表示中
- 为了以二进制表示
-2147483647
和+2147483647
,你需要32位。 - 一个C ++ long保证能够通过
LONG_MAX
表示最小范围LONG_MIN
因此,一个long
必须至less为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 ++标准(即C90)的C标准副本,但在C99(5.2.4.2.1节)中, <limits.h>
必须至less有这个最小值。 我不认为这是从C90改变,除了C99增加long long
types。
— 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)
但是Alf和其他人特定的是,一个长的必须是至less32位。 这是我想要build立的。 C ++标准明确指出一个字节中的位数没有被指定。 可能是4,8,16,42 …那么连接是如何能够容纳数字LONG_MIN-LONG_MAX到至less32位的呢?
为了得到至less那么多的位模式,你需要在值表示中使用32位。 由于C ++需要整数的二进制表示(标准中的显式语言,§3.9.1/ 7),QED
是的,C ++标准明确指出一个字节中的位数没有被指定。 long中的位数也没有被指定。
设置一个数字的下限不是指定它。
C ++标准在一个地方说:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).
它实际上在另一个地方说,通过包含C标准:
CHAR_BITS >= 8; SHORT_BITS >= 16; INT_BITS >= 16; LONG_BITS >= 32
(除AFAIK之外,标识符SHORT_BITS,INT_BITS和LONG_BITS不存在,并且这些限制是根据对types的最小值的要求推断的。
这是因为在math上需要一定数量的比特来编码(例如很长的)LONG_MIN..LONG_MAX范围内的所有值。
最后,短裤,短裤和长裤都必须由不可或缺的字符组成。 sizeof()总是报告一个整数值。 而且,通过char遍历内存字符必须访问每一个位,这有一些实际的限制。
这些要求不以任何方式不一致 。 任何满足要求的尺寸都可以。
很久以前机器的本地字大小为36位。 如果你要将一个C ++编译器移植到它们中,你可以合法地决定在char中有9位,在short和int中有18位,而在long中则有36位。 您也可以合法地决定在每种types中都有36位,因为在当今典型的32位系统中可以有32位的int。 有真实世界的实现使用64位字符。
另请参阅C ++ FAQ Lite的 26.1-6和29.5节。