2017-01-22 33 views
0

我有兩個變量,我詢問用戶輸入:添加之前的整數溢出,但不是之後?

number_1 DWORD ? 
number_2 DWORD ? 
sum   DWORD ? 

從我的理解,一個DWORD是可以從0到4,294,967,295存儲整數的32位無符號整型數據。

然而,當我輸入2147483648,或1以上的符號的整數範圍內,使用以下代碼:

call readInt 
mov  number_1, eax 

我接收在命令提示一個<32-bit integer overflow>警告。

但是,我可以輸入2,147,483,647到number_1number_2,add他們和存儲在sum沒有問題。當它顯示時,它顯示4,294,967,294,因爲它應該。

EAX寄存器是否只能接受最大有符號32位整數值?

+1

'eax'可以保存32位,而不管數據是否被認爲是有符號的或無符號的。我不知道爲什麼會發生這種情況。 – byxor

+2

你的意思是什麼「輸入」,你如何「接收」一個警告,什麼是確切的信息? – melpomene

+0

更新爲包含輸入代碼和收到的確切警告。 – cafekaze

回答

4

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

當你拿到「32位整數溢出」警告是誰寫的readInt庫函數決定數值應considerd簽訂數量的程序員。範圍從[-2GB,+ 2GB-1]。他檢查了它並標記了錯誤。

當你自己寫了下面的代碼:

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

完全取決於你,使這個同樣的決定。

對於必須執行指令add eax, ebx的處理器無關緊要。結果4294967294貼合可用的32位。即使真實總和大於4294967295,CPU也將(無抱怨)將結果的最低32位放入EAX寄存器中,並將進位標誌中的第33位置於低位。

相關問題