【发布时间】:2011-04-23 04:24:47
【问题描述】:
考虑以下一段 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 assembly overflow int unsigned