在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  網(wǎng)絡(luò)安全/ 補碼減法運算

補碼減法運算

考慮如下代碼

#include <stdio.h>
#include <limits.h>
int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

int main(void)
{
    int a = 1;
    int b = INT_MIN;
    printf("%d %d\n", a,b);
    printf("%d\n",compare((void *)&a,(void *)&b));
    return 0;
}

輸出:
output is :
1 -2147483648
-2147483647
我知道INT_MIN是-2147483648,負數(shù)比整數(shù)表示的多一個,因此INT_MAX是2147483647,在網(wǎng)上搜索了補碼的減法,A-B =A+(-B) ,等于A的補碼加(-B)的補碼,可是-B即2147483648已經(jīng)超出了INT_MAX,所以這種情況下減法是如何進行的?

回答
編輯回答
陪我終

溢出正是補碼的一個特質(zhì),中間過程的溢出不會影響結(jié)果。

這里的結(jié)果溢出了,因為已經(jīng)超出了正整數(shù)的表示范圍(2147483649)。但是不是由于補碼溢出導(dǎo)致的,而是在有限精度內(nèi)的正常結(jié)果。

我還是舉個例子吧。

2147483647 + 10 - 20

明顯第一步的加法運算溢出了,但是最后我們還是會得到正確的2147483637。因為2147483647 + 10 = 2147483657 = -2147483639,而-2147483639 - 20 = -2147483659又會溢出,得到2147483637。

2018年9月19日 06:36
編輯回答
誮惜顏

你問題是關(guān)于補碼減法,例子里弄一堆指針轉(zhuǎn)換有何意義?直接用

printf("%d\n", a - b);

不就把問題說清楚了么。

C里面忽略整數(shù)溢出錯誤。-INT_MIN用補碼表示還是INT_MIN,其中的溢出被C忽略了。所以結(jié)果是1 + INT_MIN。

2017年8月17日 02:12