【问题标题】:uint32_t vs int as a convention for everyday programminguint32_t vs int 作为日常编程的约定
【发布时间】:2013-11-19 16:51:27
【问题描述】:

什么时候应该使用 stdint.h 中的数据类型? 总是将它们用作约定是否正确? 非特定尺寸类型(如 int 和 short)的设计目的是什么?

【问题讨论】:

    标签: c int uint32


    【解决方案1】:

    什么时候应该使用 stdint.h 中的数据类型?

    1. 当编程任务指定整数宽度时,特别是为了适应某些文件或通信协议格式。
    2. 当需要平台之间的高度可移植性而不是性能时。

    总是将它们用作约定是否正确(那么)?

    事情正朝着那个方向发展。固定宽度类型是最近添加到 C 中的。原始 C 有 char, short, int, long 并且 that 在尝试时是渐进的,而不是 具体,以适应各种整数适用于各种处理器和环境的尺寸。由于 C 已经 40 岁左右,它说明了该策略的成功。已经编写了许多 C 代码并成功地处理了软整数规范大小。随着对一致性的需求不断增加,char, short, int, long and long long 还不够(或者至少不是那么容易),因此int8_t, int16_t, int32_t, int64_t 诞生了。新语言往往需要非常具体的固定整数大小类型和 2 的补码。正如他们成功的那样,达尔文式的压力将推动 C。我的水晶球说,我们将看到 C 中越来越多地使用固定宽度类型的缓慢迁移。

    设计非特定尺寸类型(如 int 和 short)的目的是什么?

    这是适应各种整数宽度(8、9、12、18、36 等)和编码(2's​​、1's、符号/mag)的良好第一步。今天很多编码都使用 2 的补码大小的 2 次方整数,以至于人们可能没有意识到事先存在许多其他安排。另见answer

    【讨论】:

    • afaik, int 被设计为可以由 cpu 最有效地处理的数据类型(例如 cpu 寄存器)。 long 更长,short 更短(但可以访问,例如寄存器的一半(alah on x86)。
    • @ensc 同意int 是“CPU 效率最高的”或“本机”CPU 整数大小。但对于某些具有“本机”8 位整数(旧 CPU 和今天的小型嵌入式 CPU)的 CPU,情况并非总是如此。但是 C 至少需要 16 位才能使 int 兼容。
    • #2 是错误的。现在不需要出于任何原因使用普通的“int”(除了与使用 int 的现有 API 的兼容性),您可以通过使用 int_fast16_t(等)获得 stdint.h 类型的可移植性和性能。
    【解决方案2】:

    我的工作要求我使用它们,而且我真的很喜欢使用它们。

    当我必须实现一个协议并在一个结构中使用它们时,我发现它很有用,该结构可以是需要发送的消息或某些信息的持有者。

    如果我必须使用需要递增的序列号,我不会使用 int,因为序列号不应该是负数。我改用 uint32_t 。因此,我将知道序列号空间并可以相应地计划/编码。

    我们编写的代码将在 32 位和 64 位机器上运行,因此在不同的位机器上使用“int”会导致难以识别的细微错误。使用 unint16_t 将在 32 或 64 位架构上分配 16 位。

    【讨论】:

    • uint32_t(32 位系统)uint32_t(64 位系统)和 int 之间的不同语义会对不使用大量显式转换的代码造成严重破坏。有符号类型之间的交互往往更加“理智”。
    【解决方案3】:

    不,我会说将它们用于通用编程绝不是一个好主意。

    如果您真的关心位数,请继续使用它们,但对于大多数一般用途您并不关心,因此请使用一般类型。一般类型可能更快,而且它们当然更容易读写。

    【讨论】:

    • @anishsane: 是的,但是如果您在 16 位平台上工作,总是使用 32 位整数,即使 16(“本机”int)足以减慢程序速度。
    • @MatteoItalia 那为什么你有uint_least8_tint_fast16_t... uint32_t
    • 还应注意,uint32_tint32_t 等是由实现提供的可选,根据 C99 7.20.1.1-3。只需要 fastleast 类型,每种类型 8 个(8、16、32、64,每个签名和未签名,是唯一强制的)。
    • @Guy 您正在使用的实现可能需要它,但标准相当生硬。从 7.20.1.1-3 "这些类型是可选的。但是,如果实现提供宽度为 8、16、32 或 64 位的整数类型,则没有填充位,并且(对于有符号类型)具有二进制补码表示,它应该定义相应的 typedef 名称。" 当然,您可能会得到各种不同的含义意味着
    • @MatteoItalia:“即使 16 位就足够了”:那么你应该使用 uint16_t。
    【解决方案4】:

    仅在真正需要时才应使用固定宽度数据类型(例如,在实现传输协议或访问硬件或需要一定范围的值时(您应该在那里使用..._least_... 变体))。您的程序不会适应变化的环境(例如,在 10 年前使用 uint32_t 文件大小可能还可以,但 off_t 将适应最近的需求)。正如其他人指出的那样,在 16 位平台上,int 可能比 uint32_t 更快,因此可能会对性能产生影响。

    int 本身由于其签名而存在很大问题;最好使用例如size_t 当变量保存strlen()sizeof() 的结果时。

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多