補碼(two's complement) 在
計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與
原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
先看代碼:
#include <stdlib.h> #include <stdio.h> int main() { int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//這句話被打印 else printf("a+b<0\n"); int z = a+b; if(z > 0) printf("z>0\n"); else printf("z<0\n");//這句話被打印 unsigned int uni=a+b; int i = a+b; printf("uni=%u, i=%d\n", uni, i);//uni=4294967294, i=-2 printf("uni=%d, i=%d\n", uni, i);//uni=-2, i=-2 printf("uni=%u, i=%u\n", uni, i);//uni=4294967294, i=4294967294 if(i==uni){ printf("equal\n");//這句話被打印 }else{ printf("not equal\n"); } }
解釋一下原因,int類型的最高位表示正負,如果最高位是1,則表示負數。而unsigned int的最高位是有效數位。
當int和unsigned in相加時,要將int轉化為unsigned int,而int小於0,所以它的最高位是符號位,為1,所以轉化的結果是一個很大的正數,在第一個if語句中,是兩個“正數”相加,結果自然就大於0了。而在z = a+b這一句時,它把a+b的結果看做一個int類型,而a+b最高位為1,所以z是一個負數,所以打印的是第二個語句。
參考了這篇文章:http://blog.csdn.net/thefutureisour/article/details/8147277
