關於unsigned int和int的加法


補碼(two's complement) 在 計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與 原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
計算機中的符號數有三種表示方法,即 原碼反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM