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