每个C和C ++标准是否允许sizeof
数字类型而不是是2的幂?
以下约束是已知的:
16 <= CHAR_BIT * sizeof(int) <= CHAR_BIT * sizeof(long)
32 <= CHAR_BIT * sizeof(long) <= CHAR_BIT * sizeof(long long)
2 <= sizeof(int) && 4 <= sizeof(long)
这是否意味着sizeof(int) == 3 && sizeof(long) == 5
是一种有效行为?
如果是 - 是否有任何已知的编译器/架构以类似的方式运行?
答案 0 :(得分:12)
我认为3.9.1 / 2(C ++ 98)很好地总结了这一点(紧接着是无符号类型的类似信息):
有四种有符号整数类型:“signed char”,“short int”, “int”和“long int”。在此列表中,每种类型至少提供为 与列表中前面的存储一样多的存储空间。平原有 执行体系结构建议的自然大小 环境39);提供其他有符号整数类型以满足 特殊需要。
基本上我们所知道的是sizeof(char) == 1
并且每个“更大”的类型至少都是那么大,int
是架构的“自然”大小(据我所知) “自然”取决于编译器编写者。我们不知道CHAR_BIT * sizeof(int) <= 32
等等。另请注意,CHAR_BIT
也不一定是8。
对于那些本地使用这些大小的硬件来说,允许三个字节int
和五个字节long
似乎是相当安全的。但是我不知道任何这样的硬件/架构。
编辑:正如在@Nigel Harper评论中指出的那样,我们知道int
必须至少为16位且long
至少为32位才能满足范围要求。否则,除上述情况外,我们没有任何特定的尺寸限制。
答案 1 :(得分:6)
行为有效并且此类编译器/体系结构确实存在
int
,5字节long
short
,3字节int
,6字节long
double
,10字节long double
用于表示类型
long
的位数并不总是与类型int
中的位数相同或是整数倍。可能需要表示更大范围的值(比int类型更可能)的能力,但处理器成本也可能是一个考虑因素......Derek M. Jones' The New C Standard (Excerpted material) - An Economic and Cultural Commentary
另一个答案已经回顾了C ++标准要求。类似地,C标准也没有将字节类型(浮点或整数)大小限制为2的幂。最常见的例子是long double
,在x86中最常见的是10个字节(填充到许多现代编译器中有12或16个字节。)
ISO / IEC 9899:1999(E)
5.2.4.2.1整数类型的大小
- 下面给出的值应替换为适用于
醇>#if
预处理指令的常量表达式。此外,除CHAR_BIT
和MB_LEN_MAX
之外,以下内容应替换为与表达式相同的表达式,该表达式是根据整数提升转换的相应类型的对象。 它们的实现定义值的大小(绝对值)应与所示值相同或更大,且符号相同。 [...]6.2.5类型
有五种标准的有符号整数类型,指定为
signed char
,short int
,int
,long int
和long long int
。 (这些和其他类型可以用其他几种方式指定,如6.7.2中所述。)也可能存在实现定义的扩展有符号整数类型。 28)
标准和扩展有符号整数类型统称为有符号整数类型。 29)- 醇>
对于具有相同签名和不同整数转换等级的任何两个整数类型(见6.3.1.1),具有较小整数转换等级的类型的值范围是该值的子范围其他类型。
奇数大小的整数类型更为罕见,但仍然存在。许多DSP都具有符合标准的编译器非幂或2类型,其中int
具有32位,long
具有 40位。< / p>
long
是
- 对于C6000 COFF,为40位或5个字节。 这完全符合任何主要的C / C ++标准,因为这些标准都定义了长度为4字节的最低要求(aka。long int) 。程序员经常错误地认为这种类型的大小恰好是4个字节。
强调我的
C89 Support in TI Compilers#Misunderstandings about TI C
越位注意:在某些TI目标上,即使long long
也是32位或40位类型,它在C89中作为扩展名有效但违反了C99
有些目标有
long long
(来自C99的扩展名),但不是符合要求的目标。 C99至少需要64位,但C2700需要32位long long
,而C5500需要40位long long
。 C2800,C6000和ARM具有64位long long
,而C5400和MSP430不支持long long
。这在技术上并不违反C89,因为这实际上是一个扩展,但如果我们开始支持C99,这将违反C99(C99 5.2.4.2.1&#34;整数类型的大小&#34; para 1)。子>
更宽的类型尺寸甚至不必是其先前类型尺寸的倍数。继续Derek M. Jones said in The New C Standard (Excerpted material): An Economic and Cultural Commentary
...例如,德州仪器(TI)TMS320C6000(DSP处理器)使用32位表示类型
int
,使用40位表示类型long
(这种选择并不少见)。那些使用24位表示类型int
的处理器(通常为DSP)通常使用48位来表示类型long
。使用24/48位整数类型表示可以由应用程序要求驱动,其中32/64位整数类型表示不符合成本效益。
在之前我所知道的所有24位DSP CHAR_BIT == 24
中,所有类型的大小都是24位的倍数,但我发现Motorola DSP5600x/3xx series确实有& #34;奇怪&#34;类型系统
Data Type size in bits
(un)signed char 8
(un)signed short 16
(un)signed int 24
(un)signed long 48
(long)_fract 24 (48)
pointer 16/24
float/double 24+8
enum 24
所以在这种情况下sizeof(char) == 1
和sizeof(short) == 2
但sizeof(int) == 3
和sizeof(long) == 6
不幸的是,GCC会调用它们(long
和long long
)double-word integers,大多数人都会这样做,这会产生很大的误解,尽管它的大小不一定是两倍。
答案 2 :(得分:1)
C ++标准(几乎可以肯定是C标准,但我很长时间没有看过它)没有规则说明类型应该是多少位数。我知道允许9位char
,并且有36位整数的机器。我上次检查时,9或36都不是2的幂。
答案 3 :(得分:1)
绝对有24位整数的平台。目前,这仍然用于某些嵌入式应用程序。您可以查看维基百科以获取更多信息:http://en.wikipedia.org/wiki/24-bit