一个人应该在什么时候使用stdint.h中的数据类型?作为一种约定,始终使用它们是正确的吗?像int和short这样的非特定大小类型的设计目的是什么?
什么时候应该使用stdint.h中的数据类型?
事情正在朝那个方向发展。 固定宽度类型是C语言的较新添加。 最初的C只有char,short,int,long和that,这是一种进步,因为它试图在不太具体的情况下适应各种处理器和环境中可用的各种整数大小。 由于C已经有40多年历史了,这表明该策略取得了成功。 许多C代码已编写并成功应对软整数规格大小。 随着对一致性需求的增加,char,short,int,long和long long已经不足(或者至少不那么容易),因此产生了int8_t,int16_t,int32_t和int64_t。 新语言往往需要非常特定的固定整数大小类型和2的补码。 当它们被成功使用时,达尔文式的压力将推动C语言。 我的水晶球说,我们将看到C语言慢慢迁移到使用固定宽度类型。作为惯例,总是使用then吗?
对于适应各种整数宽度(8、9、12、18、36等)和编码(2的补码,1的补码,符号/幅值等)来说,这是一个不错的第一步。如今,许多编程使用大小为2的幂次方的补码整数,人们可能没有意识到在此之前存在许多其他排列方式。另请参见answer。
我的工作需要我使用它们,我实际上很喜欢使用它们。
当我必须实现协议并在结构内使用它们时,我发现它们非常有用,这个结构可以是一个需要发送出去的消息或者某些信息的容器。
如果我需要使用一个需要递增的序列号,我不会使用int,因为序列号不应该是负数。相反,我使用uint32_t。因此,我将知道序列号空间,并且可以进行计划和编码。
我们编写的代码将在32位和64位机器上运行,因此在不同的位机器上使用"int"会导致微妙的错误,这可能很难识别。使用unint16_t将在32或64位架构上分配16位。
uint32_t
之间的语义差异以及与int
之间的差异可能会对没有使用大量显式转换的代码造成严重破坏。有符号类型之间的交互往往更加“明智”。 - supercat不,我认为在一般编程中使用它们从来都不是一个好主意。
如果您真的关心位数,那么可以使用它们,但对于大多数一般用途来说,您不需要关注位数,因此使用一般类型即可。一般类型可能更快,并且肯定更易于阅读和编写。
int
)足够使用,始终使用32位整数会减慢程序速度。 - Matteo Italiauint_least8_t
或者 int_fast16_t
...如果你希望代码可移植性,就应该避免使用 int 或者 long,而是使用 uint_leastXX_t
, int_fastXX_t
, 或经典的 uint32_t
。 - benjarobin只有在确实需要时才应使用固定宽度数据类型(例如在实现传输协议、访问硬件或需要一定范围的值时应使用..._least_...
变体)。否则,您的程序将无法适应环境的改变(例如,在10年前使用uint32_t
来表示文件大小可能还可以,但是off_t
将适应最新需要)。正如其他人所指出的那样,性能可能会受到影响,因为在16位平台上,int
可能比uint32_t
更快。
int
本身因其带符号性而非常问题; 当变量保存strlen()
或sizeof()
的结果时,最好使用例如size_t
。
int
。但是对于一些CPU来说并非总是如此,因为一些旧CPU和今天的小型嵌入式CPU具有“本机”8位整数。但是C要求int
至少为16位才能符合标准。 - chux - Reinstate Monica