3字节int和5字节长?

时间:2013-07-24 13:02:43

标签: c++ c sizeof

每个C和C ++标准是否允许sizeof数字类型而不是是2的幂?

以下约束是已知的:

  • 16 <= CHAR_BIT * sizeof(int) <= CHAR_BIT * sizeof(long)
  • 32 <= CHAR_BIT * sizeof(long) <= CHAR_BIT * sizeof(long long)
  • 和其他十几个,典型的8位字节架构意味着2 <= sizeof(int) && 4 <= sizeof(long)

这是否意味着sizeof(int) == 3 && sizeof(long) == 5是一种有效行为?

如果是 - 是否有任何已知的编译器/架构以类似的方式运行?

4 个答案:

答案 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)

TL; DR

行为有效并且此类编译器/体系结构确实存在

  • TI C5500 / C6000,4字节int,5字节long
  • Motorola DSP5600x / 3xx系列,包含2字节short,3字节int,6字节long
  • x86,包含8字节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整数类型的大小

     
      
  1. 下面给出的值应替换为适用于#if预处理指令的常量表达式。此外,除CHAR_BITMB_LEN_MAX之外,以下内容应替换为与表达式相同的表达式,该表达式是根据整数提升转换的相应类型的对象。 它们的实现定义值的大小(绝对值)应与所示值相同或更大,且符号相同。 [...]
  2.         

    6.2.5类型

         
        
    1. 有五种标准的有符号整数类型,指定为signed charshort intintlong intlong long int。 (这些和其他类型可以用其他几种方式指定,如6.7.2中所述。)也可能存在实现定义的扩展有符号整数类型。 28)
        标准和扩展有符号整数类型统称为有符号整数类型。 29)

    2.   
    3. 对于具有相同签名和不同整数转换等级的任何两个整数类型(见6.3.1.1),具有较小整数转换等级的类型的值范围是该值的子范围其他类型

    4.   

奇数大小的整数类型更为罕见,但仍然存在。许多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) == 1sizeof(short) == 2sizeof(int) == 3sizeof(long) == 6

不幸的是,GCC会调用它们(longlong longdouble-word integers,大多数人都会这样做,这会产生很大的误解,尽管它的大小不一定是两倍。

答案 2 :(得分:1)

C ++标准(几乎可以肯定是C标准,但我很长时间没有看过它)没有规则说明类型应该是多少位数。我知道允许9位char,并且有36位整数的机器。我上次检查时,9或36都不是2的幂。

答案 3 :(得分:1)

绝对有24位整数的平台。目前,这仍然用于某些嵌入式应用程序。您可以查看维基百科以获取更多信息:http://en.wikipedia.org/wiki/24-bit