【问题标题】:Exact-width integer types in C (stdint.h)C 中的精确宽度整数类型 (stdint.h)
【发布时间】:2011-02-04 21:02:34
【问题描述】:

我希望 char、short 和 int 类型为 1、2 和 4 字节宽度。我在源代码中包含了一个 stdint.h 标头。这是否保证 int8_t、int16_t 和 int32_t 整数类型将具有指定的宽度?实现这一目标的最佳方法是什么?

【问题讨论】:

  • 这是操作系统/架构定义的。对于 32 位机器,它们应该具有该大小。
  • 是的,但是我在这里读到很多编译器不支持stdint.h。
  • 它有时还取决于编译器(以及所使用的标志)。你正在使用什么操作系统/CPU/编译器?
  • Ubuntu 10.10 / Core 2 Quad / GCC 4.4
  • 是 C99 头文件,在较旧的编译器中不可用。最重要的是它直到 2010 版本才包含在 VC++ 中。但是可以从msinttypes.googlecode.com/svn/trunk/stdint.h 获得一个可用的实现,因为它完全是一个头实现,您可以为您可能使用的任何目标/编译器创建自己的实现;编译器的文档将指定所有内置类型的大小。

标签: c integer size


【解决方案1】:

如果这些类型存在,它们具有正确的宽度并以二进制补码形式编码。

编辑:您应该能够检查类型是否存在类似

#ifdef INT32_MAX
...
#endif

但在所有最终用户架构(PC 等)上,这些类型通常确实存在。

【讨论】:

  • @Conrad - 仅当它们不可用时。如果它们存在,它们就必须存在。
  • 对。但是,它们仍然不能保证存在(人们可能会想象一种合理的架构,只允许对 64 位和 8 位值进行整数运算/加载和存储)。
【解决方案2】:

stdint.h 中定义的类型的全部目的是它们具有指定的宽度。所以int8_t 将是 8 位宽,int16_t - 16 位宽,等等。

【讨论】:

    【解决方案3】:

    stdint.h 一些精确宽度的整数类型。这些是(来自wikipedia):

    Specifier   Signing      Bits   Bytes   
    int8_t        Signed       8       1    
    uint8_t       Unsigned     8       1    
    int16_t       Signed       16      2    
    uint16_t      Unsigned     16      2    
    int32_t       Signed       32      4    
    uint32_t      Unsigned     32      4    
    int64_t       Signed       64      8 
    uint64_t      Unsigned     64      8    
    

    如果您想知道确切的尺寸,请使用它们。 C99 要求这些类型具有指定的大小。所有其他类型都依赖于平台。

    根据limits.h,保证其他类型具有一定的最小宽度。但它们同样可以比这更大。这取决于实施。

    【讨论】:

      【解决方案4】:

      C99 的 stdint.h 实际上并不保证这些类型存在。引用wikipedia:

      这些类型是可选的,除非实现支持宽度为 8、16、32 或 64 的类型,然后将它们类型定义为具有相应 N 的相应类型。

      但是,如果它们确实存在,它们将是正确的宽度。

      【讨论】:

      • 实际上,如果实现不使用二进制补码表示,标准似乎可以选择定义带符号的类型。 7.18.1.1 精确宽度整数类型¶ 3:“这些类型是可选的。但是,如果实现提供宽度为 8、16、32 或 64 位的整数类型,则没有填充位,并且(对于有符号类型)具有二进制补码表示,它应定义相应的 typedef 名称。"
      猜你喜欢
      • 2023-03-05
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多