添加之前整数溢出,但之后没有?
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_1
和 number_2
,add
并存储在 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 位放入进位标志。
我有两个变量要求用户输入:
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_1
和 number_2
,add
并存储在 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 位放入进位标志。