添加前整数溢出,但不是之后?

时间:2017-01-22 05:42:29

标签: assembly masm

我有两个变量要求用户输入:

number_1    DWORD   ?
number_2    DWORD   ?
sum         DWORD   ?

根据我的理解,DWORD是一个无符号的32位整数数据,可以存储从0到4,294,967,295的整数。

但是,当我输入2,147,483,648,或者输入超过有符号整数范围的1时,使用下面的代码:

call    readInt
mov     number_1, eax

我在命令提示符下收到<32-bit integer overflow>警告。

但是,我可以将2,147,483,647输入到number_1number_2add,并存储在sum中,没有问题。并且在显示时它显示为4,294,967,294,正如它应该的那样。

EAX寄存器是否只能接受最多有符号32位整数的最大值?

1 个答案:

答案 0 :(得分:4)

void func(Foo const &f) { }寄存器可以接受任何可以使用32位表示的值。

当你得到&#34; 32位整数溢出&#34;警告编写 readInt 库函数的程序员,决定值应该考虑签名数量。范围从[-2GB,+ 2GB-1]。他检查了它并标记了错误。

当您自己编写以下代码时:

std::vector<double>

完全取决于你做出同样的决定。

对于必须执行EAX指令的处理器而言并不重要。结果4294967294适合可用的32位。即使真正的总和大于4294967295,CPU也会毫无怨言地将结果的最低32位放入mov eax, 2147483647 mov ebx, 2147483647 add eax, ebx 寄存器和进位标志中的第33位。