溢位和補碼

2022-09-20 09:42:12 字數 1114 閱讀 4075

今天在學j**a的時候,看到這樣一段**:

public class overflow 

}

want = 20_000_000_000

got = -1_474_836_480

相信大家都知道這是溢位了,int32位的,能表示帶符號位的-2_147_483_648 ~ 2_147_483_647,因為20_000_000_000超出了這個範圍,所以產生了錯誤。

下面是計算過程:

對於32位bit來說,它能表示的數是04_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_4802_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為運算結果符號位...