Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3字节整数和5字节长? < C和C++标准中的每个允许数字类型的 sieOs/不是两个幂吗?< /P>_C++_C_Sizeof - Fatal编程技术网

3字节整数和5字节长? < C和C++标准中的每个允许数字类型的 sieOs/不是两个幂吗?< /P>

3字节整数和5字节长? < C和C++标准中的每个允许数字类型的 sieOs/不是两个幂吗?< /P>,c++,c,sizeof,C++,C,Sizeof,已知以下约束条件: 16我认为3.9.1/2(C++98)很好地总结了这一点(紧接着是无符号类型的类似信息): 有四种带符号整数类型:“带符号字符”、“短整数”, “int”和“long int”。在此列表中,每种类型至少提供 与列表中前面的存储空间相同。普通INT具有 执行架构建议的自然大小 环境(39),;提供其他带符号整数类型以满足以下要求: 特殊需要 基本上,我们所知道的是sizeof(char)==1,每个“较大”的类型都至少有那么大,而int是架构的“自然”大小(据我所知,“自然”

已知以下约束条件:

  • 16我认为3.9.1/2(C++98)很好地总结了这一点(紧接着是无符号类型的类似信息):

    有四种带符号整数类型:“带符号字符”、“短整数”, “int”和“long int”。在此列表中,每种类型至少提供 与列表中前面的存储空间相同。普通INT具有 执行架构建议的自然大小 环境(39),;提供其他带符号整数类型以满足以下要求: 特殊需要


    基本上,我们所知道的是
    sizeof(char)==1
    ,每个“较大”的类型都至少有那么大,而
    int
    是架构的“自然”大小(据我所知,“自然”取决于编译器编写者)。我们不知道任何东西,比如代码> CARYBIT**siZOF(int)

    C++标准(几乎可以肯定的是C标准,但我很久没有看它)没有一个规则说明一个类型应该是多少比特。我知道一个事实,9位

    char
    是允许的,有些机器有36位整数。上次我检查时,9和36都不是2的幂

    肯定有24位整数的平台。这在今天仍然用于某些嵌入式应用程序。您可以查看维基百科了解更多信息:

    TL;博士 这种行为是有效的,并且确实存在这样的编译器/体系结构

    • TI C5500/C6000,4字节
      int
      ,5字节
    • 摩托罗拉DSP5600x/3xx系列,2字节
      ,3字节
      int
      ,6字节
    • x86,8字节
      双精度
      ,10字节
      长双精度
    用于表示类型
    long
    的位数并不总是与类型
    int
    中的位数相同或整数倍。可能需要能够表示更大范围的值(比int类型中可能的值),但处理器成本也可能是一个考虑因素


    另一个答案已经重写了C++标准要求。类似地,C标准也没有将字节中的类型(浮点或整数)大小限制为2的幂。最常见的例子是长双精度

    ,在x86中通常为10个字节(在许多现代编译器中填充为12或16个字节)

    ISO/IEC 9899:1999(E)

    5.2.4.2.1整型尺寸
  • 以下给出的值应替换为适用于
    #if
    预处理指令的常量表达式。此外,除了
    CHAR_BIT
    MB_LEN_MAX
    之外,下列表达式应替换为与根据整数转换的相应类型的对象具有相同类型的表达式其实现定义值的大小(绝对值)应等于或大于所示值,并带有相同的符号。[…]
  • 6.2.5类型
  • 有五种标准的有符号整数类型,分别指定为
    有符号字符
    短整数
    整数
    长整数
    长整数
    。(如6.7.2所述,这些类型和其他类型可通过几种附加方式指定。)也可能有实现定义的扩展有符号整数类型。28)

    标准和扩展的有符号整数类型统称为有符号整数类型。29)

  • 对于具有相同符号和不同整数转换秩的任何两个整数类型(见6.3.1.1),具有较小整数转换秩的类型的值范围是另一类型值的子范围


  • 奇数大小的整数类型更为罕见,但仍然存在。许多DSP具有符合标准的编译器,具有非幂或-2类型,其中
    int
    具有32位,
    long
    具有40位

    long

    • C6000 COFF为40位或5字节这完全符合任何主要的C/C++标准,因为这些标准都定义了4字节长的最低要求(也称为.long int)。程序员经常错误地假设这种类型的大小正好是4字节
    强调我的

    越位注意:在某些TI目标上,甚至
    long
    也是32或40位类型,在C89中作为扩展有效,但违反C99

    一些目标具有
    long
    (C99的扩展),但不是一致性目标。C99至少需要64位,但C2700具有32位
    ,C5500具有40位
    。C2800、C6000和ARM具有64位
    long-long
    ,C5400和MSP430不支持
    long-long
    。这在技术上并不违反C89,因为这实际上是一个扩展,但如果我们开始支持C99,这将违反C99(C99 5.2.4.2.1“整数类型的大小”第1段)

    较宽类型的大小甚至不必是其前一个类型大小的倍数。继续做什么

    。。。例如,德州仪器公司的DSP处理器TMS320C6000使用32位表示类型
    int
    ,40位表示类型
    long
    (这种选择并不少见)。那些使用24位表示类型
    int
    的处理器(通常是DSP),通常使用48位表示类型
    long
    。24/48位整数类型表示的使用可以由应用程序需求驱动,其中32/64位整数类型表示不具有成本效益

    在我以前知道的所有24位DSP中,
    CHAR\u bit==24
    ,所有类型的大小都是24位的倍数,但我只是