- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
直到最近,我还认为大多数系统实现者/供应商决定在 64 位机器上保持纯 int
32 位是一种权宜之计。对于现代 C99 固定大小类型(int32_t
和 uint32_t
等),需要每个大小为 8、16、32 和 64 的标准整数类型大部分消失了,看起来 int
也可以变成 64 位。
然而,C 中普通 int
大小的最大实际后果来自于 C 本质上没有对小于 int
类型的算术运算。特别是,如果 int
大于 32 位,则 uint32_t
值的任何算术结果都具有 signed int
类型,这是相当令人不安的.
这是将 int
在实际实现中永久固定为 32 位的充分理由吗?我倾向于说是。在我看来,uint32_t
可能有一大类用途,当 int
大于 32 位时就会中断。即使应用一元减号或按位补码运算符也会变得危险,除非您转换回 uint32_t
。
当然,同样的问题适用于当前实现的 uint16_t
和 uint8_t
,但每个人似乎都知道并习惯于将它们视为“小于-int
"类型。
最佳答案
如您所说,我认为晋升规则确实是 killer 锏。 uint32_t
然后会提升为 int
并且突然间您将拥有带符号的算术,而几乎每个人都期望无符号。
这将主要隐藏在您仅进行算术运算并分配回 uint32_t
的地方。但在与常量进行比较的地方,它可能是致命的。依赖于这种比较而不进行显式转换的代码是否合理,我不知道。像 (uint32_t)1
这样的转换常量会变得非常乏味。我个人至少总是使用后缀 U
作为我想要无符号的常量,但这已经不像我想要的那样可读了。
另请记住,uint32_t
等不能保证存在。甚至 uint8_t
。其实现是 POSIX 的扩展。因此,从这个意义上说,C 作为一种语言远不能实现这一目标。
关于c - 将 plain int 64 位制作成会破坏很多合理的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559251/
我是一名优秀的程序员,十分优秀!