今天在學j**a的時候,看到這樣一段**:
public class overflow
}
want = 20_000_000_000
got = -1_474_836_480
相信大家都知道這是溢位了,int
是32
位的,能表示帶符號位的-2_147_483_648 ~ 2_147_483_647
,因為20_000_000_000
超出了這個範圍,所以產生了錯誤。
下面是計算過程:
對於32位bit來說,它能表示的數是0
到4_294_967_295
,考慮上符號位後,表示的就是-2_147_483_648 ~ 2_147_483_647
,mod =4_294_967_296
1_000_000_000 * 20 = 20_000_000_000 > 2_147_483_647
,溢位取餘-->20_000_000_000 mod 4_294_967_296 = 2_820_130_816
2_820_130_816 > 2_147_483_647
,所以我們知道這是乙個負數的補碼。在補碼中,2_820_130_816表示的是該數關於模的同餘數
求補數:4_294_967_296 - 2_820_130_816 = 1_474_836_480
,所以在補碼中,這個溢位導致的最終輸出是-1_474_836_480
回到同餘:
-1_474_836_480 mod 4_294_967_296 = 2_820_130_816
2_820_130_816 mod 4_294_967_296 = 2_820_130_816
-1_474_836_480
和2_820_130_816
關於模4_294_967_296
同餘
不得不說,同餘還真是好用啊!理解了它,就理解了補碼
補碼溢位判斷
補碼可以將減法轉化為加法,但有些電路需要判斷加法是否溢位。判斷加法是否溢位的條件是最高有效位和符號有效位。對於nbit的二進位制數,符號位為最高位,最高有效位為符號位的低1位。加法有四種情況 正 負 負 正 正 正 負 負 其中 負 正 和 正 負 是一定不會溢位的,但是它們的符號位進製和有效位進製...
雙符號位補碼(用於修正單符號位補碼 法溢位)
用兩個符號位進行修正 正數符號位為 00 負數符號位為 11 當兩位符號位 為 01,10時就是溢位,這時取最高位為符號位,其他位為數值位 includeusing namespace std int binary x 6 int binary y 6 void baseconversion int...
補碼的加減及溢位判斷 加法器
加法 整數 a 補 b 補 a b 補 mod 2 n 1 小數 a 補 b 補 a b 補 mod 2 減法 整數 a b 補 a 補 b 補 mod 2 n 1 小數 a b 補 a 補 b 補 mod 2 補碼加法運算溢位判斷三種方法 方法一 xf yf分別兩個數的符號位,zf為運算結果符號位...