我有两个变量要求用户输入:
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位整数的最大值?
答案 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位。