“长”保证至less有32位?

通过阅读C ++标准,我一直认识到C ++中积分基本types的大小如下:

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

我从3.9.1 / 2推导出来的:

  1. 有四个有符号整数types:“signed char”,“short int”,“int”和“long int”。在这个列表中,每个types至less提供与列表中的前一个types相同的存储。 Plain int具有执行环境的体系结构所build议的自然大小

此外, char的大小被3.9.1 /描述为:

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

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

  1. 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位? 如果是这样,请具体说明如何作出这项保证。 我只是没有看到它。

  1. C ++标准专门说,为了了解C ++,你必须知道C(1.2 / 1) 1

  2. C ++ Standard隐含地定义了一个long可以容纳的值的最小限制是LONG_MINLONG_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_MINstd::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX

因此,即使C ++标准没有指定(带符号)负数的按位表示,它也必须是二进制补码,总共需要32位存储空间,或者它有一个明确的符号位,这意味着它有还有32位的存储空间。

答案肯定是肯定的。 阅读我的OP和所有的意见,以了解为什么,但这里的简短版本。 如果您怀疑或质疑这一切,我鼓励您阅读整个主题和所有评论。 否则,接受这个为真:

  1. C ++标准包含C标准的一部分,包括LONG_MINLONG_MAX的定义
  2. LONG_MIN被定义为不大于-2147483647
  3. LONG_MAX被定义为不小于+2147483647
  4. 在C ++中,整型types以二进制forms存储在底层表示中
  5. 为了以二进制表示-2147483647+2147483647 ,你需要32位。
  6. 一个C ++ long保证能够通过LONG_MAX表示最小范围LONG_MIN

因此,一个long必须至less为32位1

编辑:

LONG_MINLONG_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 longtypes。

 — 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节。