考虑以下 C 代码:
#include <stdint.h>
uint32_t inc(uint16_t x) {
return x+1;
}
当在纯 x86_64 系统上使用带有标志 -std=c99 -march=core2 -msse4.1 -O2 -pipe -Wall 的 gcc-4.4.3 编译时,它会生成
movzwl %di,%eax
inc %eax
retq
现在,在 C 中预测了无符号溢出。我对 x86_64 汇编了解不多,但据我所知,16 位参数寄存器正在被移动到 32 位寄存器,该寄存器会递增并返回。我的问题是,如果 x == UINT16_MAX 怎么办?会发生溢出,标准规定 x+1==0,对吧?但是,鉴于 %eax 是一个 32 位寄存器,它现在包含 UINT16_MAX+1,这是不正确的。
这让我在这里连接一个问题:是否有一种可移植的方法来禁用 C 中的无符号溢出,以便编译器可以假设存储在大寄存器中的小变量的高位将始终为 0(因此不需要清除它们)?如果没有(或者如果解决方案在语法上很糟糕),至少在 GCC 中是否有办法做到这一点?
非常感谢您的宝贵时间。
不可以,C 类型属于默认促销活动。假设uint16_t
转化排名低于int
, 将会提升为int
并且添加将作为int
,然后转换为uint32_t
返回时。
至于你最后提出的相关问题,我不太明白你想要什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)