添加之前整数溢出,但之后没有?

Integer overflow before add, but not after?

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

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 位整数的最大值?

EAX寄存器可以接受任何可以用32位表示的值。

当您收到“32 位整数溢出”警告时,编写 readInt 库函数的程序员决定了值应视为已签署的数量。范围从 [-2GB,+2GB-1]。他检查了它并标记了错误。

当你自己编写如下代码时:

mov  eax, 2147483647
mov  ebx, 2147483647
add  eax, ebx

完全由您做出同样的决定。

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