【问题标题】:How to Declare a 32-bit Integer in C如何在 C 中声明一个 32 位整数
【发布时间】:2010-11-16 18:42:56
【问题描述】:

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

【问题讨论】:

  • 在 C 中,一个字节不一定是 8 位,所以 32 位和 4 个字节可能意味着不同的东西。
  • @KTC:有没有不同的平台定义字节?
  • 我也很想知道 char!=8bits 和 byte!=8bits 的位置。 char!=8bits 似乎没问题,因为我可以在自己未设计的系统或某些旧系统中使用 char==4bits,但是 byte!=8bits 呢??
  • 相当多的 DSP 等具有 16 位字符(C 中除了字符之外没有“字节”的概念 - 它实际上是最小的可寻址内存单元)。
  • 根据您所处的寻址模式,我们仍然拥有的 Honeyboxen 有 6 位和 9 位字节。

标签: c portability


【解决方案1】:
#include <stdint.h>

int32_t my_32bit_int;

【讨论】:

  • 请注意 intN_t(和 uintN_t)在标准方面是可选的。当且仅当系统具有满足要求的类型时才需要定义。
  • 这就是你想要的。如果代码确实需要 32 位 int,并且您尝试在不支持它们的平台上编译它,那么您希望编译器将其返回给开发人员。让它选择其他尺寸并继续下去会很糟糕。
  • 请注意,标头“&lt;inttypes.h&gt;”已明确记录为包含标头“&lt;stdint.h&gt;”(这对于 C 标头不常见),但“&lt;inttypes.h&gt;”标头可能可用其中 '&lt;stdint.h&gt;' 不是并且可能是可移植性的更好选择。 '&lt;stdint.h&gt;' 标头是标准委员会的一项发明,它的创建是为了使 C 的独立实现(与托管实现相反 - 普通实现)只需要支持 '&lt;stdint.h&gt;' 而不一定支持 '@ 987654328@'也是(这也意味着支持'&lt;stdio.h&gt;',否则没有必要)。
  • 有没有办法将 int32_t 定义为无符号?
  • @MatthewHerbst, uint32_t.
【解决方案2】:

C 本身不太关心整数类型的确切大小,C99 引入了标题 stdint.h ,这可能是您最好的选择。包括它,你可以使用例如int32_t。当然不是所有平台都支持。

【讨论】:

    【解决方案3】:

    在我看来,Corey 对“最佳”的回答是正确的,但一个简单的“int”在实践中也可以使用(假设您忽略了具有 16 位 int 的系统)。在这一点上,很多代码都依赖于 int 是 32 位的,因此系统供应商不会更改它。

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

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

    【讨论】:

    • 没有必要“忽略 16 位 int 的系统”,long 保证在任何地方至少是 32 位宽。
    • 是的,但是使用“long”并不能解决初始请求,这正是 32 位。例如,在 64 位 Linux(至少某些版本)上,long 是 64 位——这可能会在实际实践中出现。
    【解决方案4】:

    如果您没有 stdint.h,您可以查找 Brian Gladman 的 brg_types.h 的副本。

    brg_types.h 将发现您平台上各种整数的大小,并为常见大小创建 typedef:8、16、32 和 64 位。

    【讨论】:

    • 其实在查看几个“brg_types.h”时发现,这个文件只定义了无符号整数(例如“uint_8t”、“uint_16t”、“uint_32t”和“uint_64t”)。 OP 需要有符号整数。
    【解决方案5】:

    您需要包含inttypes.h 而不是stdint.h,因为stdint.h 在Solaris 等某些平台上不可用,而inttypes.h 将在Linux 等系统上为您包含stdint.h。 如果您包含 inttypes.h,那么您的代码在 Linux 和 Solaris 之间的可移植性更高。

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

    如果您打算在数据类型中存在一定数量的位,则此链接有一个表格显示为什么您不想使用 longintIBM link about portable data types

    【讨论】:

      【解决方案6】:

      C99 或更高版本

      使用&lt;stdint.h&gt;

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

      如果不是,那么下一个最好的方法是 int_least32_t,它是至少 32 位的实现支持的整数类型,与表示方式(二进制补码、一个补码等)无关。

      还有int_fast32_t,它是一个至少 32 位宽的整数类型,选择该类型的目的是为了满足该大小要求的最快操作。

      ANSI C

      您可以使用long,由于标准规定的最小范围要求,它保证至少为 32 位宽。

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

      #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
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          还取决于您的目标平台,您可以为构建系统使用自动工具

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              您可以用有符号或无符号长声明 32 位。

              int32_t variable_name;
              uint32_t variable_name;
              

              【讨论】:

                猜你喜欢
                • 2011-05-03
                • 2012-05-24
                • 2017-08-03
                • 2023-03-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-08-18
                • 1970-01-01
                相关资源
                最近更新 更多