簡體   English   中英

如何檢查兩個有符號的32位整數是否導致MIPS溢出?

[英]How to check if two signed 32 bit integers cause overflow in MIPS?

我發現對於兩個無符號整數,我可以這樣做:

sll $a0, $a0, 31                          #a0 is integer 1 to be added

sll $a1, $a1, 31 #a1 is integer 2

add $t0, $a0, $a1 #result in $t0

addi $t1, $0, 2

beq $v0, $t0, $t1

這樣做是將兩個整數的第32位移到第一個位點,然后將它們相加。 如果這兩個數字均為1,則$ t1中的答案將為2(01 + 01 = 10)。 因此,發生了溢出。

但是,對於有符號整數,前導數字表示負整數。 我已經排除了溢出的可能性,因為兩個整數都相反的符號,但是假設它們是相同的符號。 然后010 + 011(兩個正整數)會給我101,但是因為這是帶符號的。 這將成為一個負整數。 我是否只需檢查一下數字是否已更改符號? 對於兩個負整數,我可以檢查是否為無符號?

所以您在談論有符號溢出? 如果進位與進位不匹配,則為有符號溢出。

abi or
000 00
001 01 signed overflow
010 01
011 10
100 01
101 10
110 10 signed overflow
111 11

a和b是操作數,i是進位,o是進位,r是結果。

注意到關於a,b和r之間關系的任何信息嗎? 您可以通過簡單地查看兩個操作數的msbit和結果來確定有符號的溢出。

這與mips完全無關,它是基本的二進制補碼加法(和減法)。 要將其應用於指令集,您需要隔離操作數的msbit,以及它們是否與結果匹配。 可以使用測試,也可以使用,假設它填充了已知的內容(例如零而不是符號擴展,或者符號擴展會有所幫助),則將其移位31位。 加零,檢查z標志。 mips不會使用標志,因此,或進行移位以隔離,然后比較是否相等是一個很好的通用解決方案。 可以同時測試進位與進位(並且兩個操作數都為0x7FFFFFFF然后相加,然后右移31,或者隔離進位和兩個操作數msbit,然后將這三個項目相加,看看進位是否相同或不同,需要更多說明)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM