C和C ++中的积分/算术类型的大小保证

时间:2010-11-03 21:23:28

标签: c++ c sizeof primitive-types

我知道C ++标准明确保证仅charsigned charunsigned char的大小。此外,它还保证,short至少与char一样大,intshort一样大。但是没有明确保证绝对值,比如说,sizeof(int)。这是我头脑中的信息,我和它幸福地生活在一起。然而,不久之前,我在SO中找到了一条评论(找不到它),在C long中保证至少有4个字节,并且该要求是由C ++“继承”的。是这样的吗?如果是这样,我们对C ++中算术类型的大小有什么其他的隐含保证?请注意,我对这个问题中不同平台的实用保证完全不感兴趣,只是理论

7 个答案:

答案 0 :(得分:13)

18.2.2保证<climits>具有与C库标题<limits.h>相同的内容。

ISO C90标准很难掌握,考虑到C ++依赖它,这是一个耻辱,但“数字限制”部分(随机草案编号为2.2.4.2,我有一次追踪并且说谎around)给出INT_MAX<limits.h>等常量的最小值。例如,ULONG_MAX必须至少为4294967295,我们从中推断出long的宽度至少为32位。

C99标准中有类似的限制,但当然不是C ++ 03引用的那些。

保证long至少为4个字节,因为在C和C ++中,“byte”基本上定义为“char”,并且不能保证{ {1}}在C或C ++中是8。 POSIX和Windows都保证CHAR_BIT

答案 1 :(得分:12)

不了解C ++。在C中你有


                                  Annex E
                              (informative)


                          Implementation limits

       [#1]  The contents of the header  are given below,
       in alphabetical order.  The minimum magnitudes  shown  shall
       be  replaced  by  implementation-defined magnitudes with the
       same sign.  The values shall  all  be  constant  expressions
       suitable  for  use  in  #if  preprocessing  directives.  The
       components are described further in 5.2.4.2.1.

               #define CHAR_BIT                         8
               #define CHAR_MAX    UCHAR_MAX or SCHAR_MAX
               #define CHAR_MIN            0 or SCHAR_MIN
               #define INT_MAX                     +32767
               #define INT_MIN                     -32767
               #define LONG_MAX               +2147483647
               #define LONG_MIN               -2147483647
               #define LLONG_MAX     +9223372036854775807
               #define LLONG_MIN     -9223372036854775807
               #define MB_LEN_MAX                       1
               #define SCHAR_MAX                     +127
               #define SCHAR_MIN                     -127
               #define SHRT_MAX                    +32767
               #define SHRT_MIN                    -32767
               #define UCHAR_MAX                      255
               #define USHRT_MAX                    65535
               #define UINT_MAX                     65535
               #define ULONG_MAX               4294967295
               #define ULLONG_MAX    18446744073709551615

所以char&lt; = short&lt; = int&lt; = long&lt; = long long

CHAR_BIT * sizeof(char)&gt; = 8
CHAR_BIT * sizeof(短)&gt; = 16
CHAR_BIT *(int)的大小&gt; = 16
CHAR_BIT * sizeof(长)&gt; = 32
CHAR_BIT * sizeof(long long)&gt; = 64

答案 2 :(得分:3)

是的,C ++类型大小是从C89继承的。

我现在找不到规格。但它在Bible

答案 3 :(得分:3)

请注意,这些类型的保证范围比大多数机器宽一个:

签名char -127 ... +127保证但大多数二人补充机器有-128 ... + 127

同样适用于较大的类型。

答案 4 :(得分:2)

您阅读的内容有几处不准确之处。这些不准确性要么存在于源中,要么您可能错误地记住它。

首先,关于C和C ++之间的一个特殊区别的迂腐评论。 C语言不保证整数类型的相对 sizes (以字节为单位)。 C语言仅保证其相对范围。确实,int的范围始终至少与short的范围一样大,依此类推。但是,C标准正式允许sizeof(short) > sizeof(int)。在这种情况下,short中的额外位将用作填充位,不用于值表示。显然,这只是标准中的法律语言所允许的,而不是任何人在实践中可能遇到的事情。

另一方面,在C ++中,语言规范保证了类型的相对范围和相对大小,因此在C ++中除了上述范围外从C继承的关系保证sizeof(int)大于或等于sizeof(short)

其次,C语言标准保证每个整数类型的最小范围(这些保证在C和C ++中都存在)。知道给定类型的最小范围,您可以总是说这个类型需要多少个值(作为最小位数)。例如,类型long确实需要具有至少32个值形成位以满足其范围要求。如果要将其重新计算为 bytes ,则取决于您在术语 byte 下的理解。如果你特别谈论8位字节,那么确实类型long将始终包含至少4个8位字节。但是,这并不意味着sizeof(long)始终至少为4,因为在C / C ++术语中,术语 byte 指的是char个对象。 char个对象不限于8位。在某些实现中很可能有32位char类型,这意味着例如C / C ++字节中的sizeof(long)合法地为1。

答案 5 :(得分:1)

C标准没有明确说明long必须至少为4个字节,但它们确实为不同的整数类型指定了最小范围,这意味着最小尺寸。

例如,unsigned long的最小范围是0到4,294,967,295。您需要至少32位来表示该范围内的每个数字。所以是的,标准保证(间接)long至少为32位。

C ++从C继承数据类型,因此您必须查看C标准。在这种情况下,C ++标准实际上引用了C标准的一部分。

答案 6 :(得分:1)

请注意,有些机器的字符超过8位。例如,TI C5x上的IIRC,长为32位,但sizeof(long)== 2因为chars,short和int都是16位,sizeof(char)== 1.