什么时候应该使用 stdint.h 中的数据类型?总是将它们用作约定是否正确?非特定尺寸类型(如 int 和 short)的设计目的是什么?
4 回答
什么时候应该使用 stdint.h 中的数据类型?
- 当编程任务指定整数宽度时,特别是为了适应某些文件或通信协议格式。
- 当需要平台之间的高度可移植性而不是性能时。
总是将它们用作约定是否正确(那么)?
事情正朝着这个方向发展。固定宽度类型是最近添加到 C 中的。原始 C 具有char, short, int, long
并且在尝试时是渐进的,但没有太具体,以适应各种处理器和环境中可用的各种整数大小。由于 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 次方整数,以至于人们可能没有意识到事先存在许多其他安排。另请参阅此答案。
我的工作要求我使用它们,我真的很喜欢使用它们。
当我必须实现一个协议并在一个结构中使用它们时,我发现它很有用,该结构可以是需要发送的消息或某些信息的持有者。
如果我必须使用需要递增的序列号,我不会使用 int 因为序列号不应该是负数。我改用 uint32_t 。因此,我将知道序列号空间并可以相应地计划/编码。
我们编写的代码将在 32 位和 64 位机器上运行,因此在不同的位机器上使用“int”会导致难以识别的细微错误。使用 unint16_t 将在 32 或 64 位架构上分配 16 位。
不,我会说将它们用于通用编程绝不是一个好主意。
如果您真的关心位数,请继续使用它们,但对于大多数一般用途您并不关心,因此请使用一般类型。通用类型可能更快,而且它们当然更容易读写。
只有在真正需要时才应该使用固定宽度数据类型(例如,当实现传输协议或访问硬件或需要一定范围的值时(您应该在..._least_...
那里使用变体))。您的程序不会适应变化的环境(例如uint32_t
,在 10 年前使用文件大小可能还可以,但off_t
会适应最近的需求)。正如其他人指出的那样,可能会int
比uint32_t
16 位平台更快地影响性能。
int
由于它的签名,它本身就很成问题;最好使用例如size_t
,当变量保存strlen()
or的结果时sizeof()
。