C和C ++中的整数/算术类型的大小保证

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

18.2.2保证具有与C库头相同的内容。

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

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

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

不了解C ++。 在C你有


                                  附件E.
                               (资料)


                          实施限制

        [#1]标题的内容如下,
       按字母顺序排列。 显示的最小量值应为
       用实现定义的量值代替
       同一个标志。 这些值都应该是常量表达式
       适用于#if预处理指令。 该
       组件在5.2.4.2.1中进一步描述。

                #define CHAR_BIT 8
                #define CHAR_MAX UCHAR_MAX或SCHAR_MAX
                #define CHAR_MIN 0或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 <= short <= int <= long <= long long

CHAR_BIT * sizeof(char)> = 8
CHAR_BIT * sizeof(短)> = 16
CHAR_BIT * size(int)> = 16
CHAR_BIT * sizeof(long)> = 32
CHAR_BIT * sizeof(long long)> = 64

是的,C ++类型大小inheritance自C89。

我现在找不到规格。 但它在圣经中 。

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

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

同样适用于较大的类型。

你读到的内容有几处不准确之处。 这些不准确性要么存在于源中,要么您可能都记错了。

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

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

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

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

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

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

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