代码之家  ›  专栏  ›  技术社区  ›  ZZ Coder

如何在C中声明32位整数

  •  60
  • ZZ Coder  · 技术社区  · 17 年前

    在任何平台上声明始终为4字节的整数类型的最佳方法是什么?我不担心某些设备或旧机器有16位 int .

    9 回复  |  直到 8 年前
        1
  •  98
  •   Corey D    17 年前
    #include <stdint.h>
    
    int32_t my_32bit_int;
    
        2
  •  12
  •   Mad Physicist    8 年前

    C不太关心整数类型的确切大小,C99引入了头 stdint.h 这可能是你最好的选择。包括这些内容,您可以使用例如 int32_t . 当然,并非所有平台都支持这一点。

        3
  •  11
  •   Brooks Moses    17 年前

    在我看来,科里的答案是“最佳”的,但是一个简单的“int”在实践中也会起作用(假设你忽略了16位int的系统)。在这一点上,如此多的代码依赖于32位的int,以至于系统供应商不会更改它。

    (另请参见为什么long在许多64位系统上是32位的,以及为什么我们有“long long”。)

    不过,使用Int32的好处之一是,您不会使这个问题长期存在!

        4
  •  5
  •   cfrantz    17 年前

    你可以找一份布莱恩·格拉德曼的 brg_types.h 如果你没有 stdint.h .

    BrgType 将发现平台上各种整数的大小,并为常见大小(8、16、32和64位)创建typedef。

        5
  •  5
  •   doubleDown    13 年前

    你需要包括 inttypes.h 而不是 stdint.h 因为 施蒂特 在某些平台(如Solaris)上不可用,并且 英特尔 将包括 施蒂特 在Linux等系统上。 如果你包括 英特尔 那么,您的代码在Linux和Solaris之间更易于移植。

    这个链接解释了我的意思: HP link about inttypes.h

    这个链接有一个表格显示了你不想使用的原因 long int 如果您打算在您的数据类型中存在一定数量的位。 IBM link about portable data types

        6
  •  0
  •   Robert Deml    17 年前

    如果stdint.h不适用于您的系统,请创建您自己的系统。我总是有一个名为“types.h”的文件,其中包含所有有符号/无符号8、16和32位值的typedef。

        7
  •  0
  •   Spudd86    17 年前

    另外,根据目标平台的不同,您可以为构建系统使用自动工具。

    它将查看stdint.h/inttypes.h是否存在,如果不存在,将在“config.h”中创建适当的typedef。

        8
  •  0
  •   Bastien Léonard    17 年前

    stdint.h是显而易见的选择,但它不一定可用。

    如果您使用的是可移植库,它可能已经提供了可移植的固定宽度整数。 例如,SDL有 Sint32 (S代表__签名_),glib已经 gint32 .

        9
  •  0
  •   Veltas    8 年前

    C99或更高版本

    使用 <stdint.h> .

    如果您的实现支持2的补码32位整数,那么它必须定义 int32_t .

    如果不是,那么接下来最好的事情是 int_least32_t 它是由至少32位的实现所支持的整数类型,不考虑表示(两个补码、一个补码等)。

    也有 int_fast32_t 它是一个至少32位宽的整数类型,其选择的目的是允许对该大小要求进行最快的操作。

    美国国家标准委员会

    你可以使用 long 根据标准规定的最小范围要求,保证至少32位宽。

    如果您希望使用最小的整数类型来适应32位数字,那么可以使用如下的预处理器语句和在中定义的宏 <limits.h> :

    #define TARGET_MAX 2147483647L
    
    #if   SCHAR_MAX >= TARGET_MAX
      typedef signed char int32;
    #elif SHORT_MAX >= TARGET_MAX
      typedef short int32;
    #elif INT_MAX   >= TARGET_MAX
      typedef int int32;
    #else
      typedef long int32;
    #endif
    
    #undef TARGET_MAX