uint32_t vs int作为日常编程的约定

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

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

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

总是将它们作为惯例使用(然后)是正确的吗?

事情就是这样倾向的。 固定宽度类型是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,1,符号/ mag)。 今天如此多的编码使用2次幂的2次幂整数,人们可能没有意识到事先存在许多其他的安排。 也见这个答案 。

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

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

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

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

不,我想说将它们用于通用编程永远不是一个好主意。

如果你真的关心位数,那么继续使用它们但是对于大多数一般用途你不关心所以然后使用一般类型。 一般类型可能更快,它们肯定更容易读写。

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

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