C和C ++中的整数/算术类型的大小保证
我知道C ++标准明确地保证了char
, signed char
和unsigned char
。 此外,它还提供了保证,例如, short
至少与char
, int
和short
等一样大。但是没有明确保证绝对值,比如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。