【发布时间】:2013-11-19 16:51:27
【问题描述】:
什么时候应该使用 stdint.h 中的数据类型? 总是将它们用作约定是否正确? 非特定尺寸类型(如 int 和 short)的设计目的是什么?
【问题讨论】:
什么时候应该使用 stdint.h 中的数据类型? 总是将它们用作约定是否正确? 非特定尺寸类型(如 int 和 short)的设计目的是什么?
【问题讨论】:
什么时候应该使用 stdint.h 中的数据类型?
总是将它们用作约定是否正确(那么)?
事情正朝着那个方向发展。固定宽度类型是最近添加到 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。
【讨论】:
int 被设计为可以由 cpu 最有效地处理的数据类型(例如 cpu 寄存器)。 long 更长,short 更短(但可以访问,例如寄存器的一半(al,ah on x86)。
int 是“CPU 效率最高的”或“本机”CPU 整数大小。但对于某些具有“本机”8 位整数(旧 CPU 和今天的小型嵌入式 CPU)的 CPU,情况并非总是如此。但是 C 至少需要 16 位才能使 int 兼容。
我的工作要求我使用它们,而且我真的很喜欢使用它们。
当我必须实现一个协议并在一个结构中使用它们时,我发现它很有用,该结构可以是需要发送的消息或某些信息的持有者。
如果我必须使用需要递增的序列号,我不会使用 int,因为序列号不应该是负数。我改用 uint32_t 。因此,我将知道序列号空间并可以相应地计划/编码。
我们编写的代码将在 32 位和 64 位机器上运行,因此在不同的位机器上使用“int”会导致难以识别的细微错误。使用 unint16_t 将在 32 或 64 位架构上分配 16 位。
【讨论】:
uint32_t(32 位系统)uint32_t(64 位系统)和 int 之间的不同语义会对不使用大量显式转换的代码造成严重破坏。有符号类型之间的交互往往更加“理智”。
不,我会说将它们用于通用编程绝不是一个好主意。
如果您真的关心位数,请继续使用它们,但对于大多数一般用途您并不关心,因此请使用一般类型。一般类型可能更快,而且它们当然更容易读写。
【讨论】:
int)足以减慢程序速度。
uint_least8_t 或int_fast16_t... uint32_t
uint32_t、int32_t 等是由实现提供的可选,根据 C99 7.20.1.1-3。只需要 fast 和 least 类型,每种类型 8 个(8、16、32、64,每个签名和未签名,是唯一强制的)。
仅在真正需要时才应使用固定宽度数据类型(例如,在实现传输协议或访问硬件或需要一定范围的值时(您应该在那里使用..._least_... 变体))。您的程序不会适应变化的环境(例如,在 10 年前使用 uint32_t 文件大小可能还可以,但 off_t 将适应最近的需求)。正如其他人指出的那样,在 16 位平台上,int 可能比 uint32_t 更快,因此可能会对性能产生影响。
int 本身由于其签名而存在很大问题;最好使用例如size_t 当变量保存strlen() 或sizeof() 的结果时。
【讨论】: