“长”保证至少有32位?

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

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

我从3.9.1 / 2推导出来的:

  • 有四个有符号整数类型:“signed char”,“short int”,“int”和“long int”。在此列表中,每种类型至少提供与列表中的前一种类型相同的存储空间。 普通整数具有执行环境架构所建议的自然大小
  • 此外, char的大小被3.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

  • 所以无论多long ,它都必须足够大才能将LONG_MIN保持为LONG_MAX。

    但是Alf和其他人特定长期必须至少有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
    

    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_MINstd::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX

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


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

  • C ++标准包含C标准的部分内容,包括LONG_MINLONG_MAX的定义
  • LONG_MIN被定义为不大于-2147483647
  • LONG_MAX被定义为不小于+2147483647
  • 在C ++中,整型类型以二进制形式存储在底层表示中
  • 为了以二进制表示-2147483647+2147483647 ,你需要32位。
  • C ++ long保证能够通过LONG_MAX表示最小范围LONG_MIN
  • 因此long必须至少有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 ++标准的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