Luí*_*ier 4 c int assembly unsigned overflow
考虑以下C代码:
#include <stdint.h>
uint32_t inc(uint16_t x) {
return x+1;
}
Run Code Online (Sandbox Code Playgroud)
当使用gcc-4.4.3在纯x86_64系统上使用标志-std = c99 -march = core2 -msse4.1 -O2 -pipe -Wall进行编译时,它会生成
movzwl %di,%eax
inc %eax
retq
Run Code Online (Sandbox Code Playgroud)
现在,在C中预测无符号溢出.我不太了解x86_64汇编,但据我所知,16位参数寄存器被移动到32位寄存器,该寄存器递增并返回.我的问题是,如果x == UINT16_MAX怎么办.会发生溢出,标准规定x + 1 == 0,对吗?但是,如果%eax是一个32位寄存器,它现在包含UINT16_MAX + 1,这是不正确的.
这让我在这里连接一个问题:是否有一种可移植的方法来禁用C中的无符号溢出,以便编译器可以假设存储在大寄存器中的小变量的高位始终为0(所以它不需要清除它们)?如果不是(或者如果解决方案在语法上是令人讨厌的),至少在GCC中有没有办法做到这一点?
非常感谢您的宝贵时间.
不,C类型受默认促销限制.假设uint16_t
转换等级低于int
,它将被提升为int
并且添加将作为a执行int
,然后uint32_t
在返回时转换为.
至于你最后的相关问题,我不太关注你想要的.