7.負數轉換無符號unsigned


//2019/03/04
#include <iostream>

int main() {
    unsigned u1 = 42, u2 = 10;
    std::cout << u1 - u2 << std::endl;
    std::cout << u2 - u1 << std::endl;
    system("pause");
    return 0;
}

結果:

 

4294967295 ??

 

首先,仔細觀察輸出的結果4294967295,發現4294967295=2^32-1,哦!好像有點規律!

但是,又為啥會是這樣?

讓我們先來討論下int和unsigned int的表現形式,他倆都是4個字節,32位的二進制表示,但int有一位是符號位,unsigned則沒有。

-1的int類型表示為1000 0000 0000 0000 0000 0000 0000 0001,

那么將其強制轉換成unsigned int 應該是1000 0000 0000 0000 0000 0000 0000 0001(紅色為符號位),用指數表示是2^31+1,而不是2^32-1!

 

由於計算機存儲的是補碼,補碼=除符號位,原碼取反+1,

即:-1:1000 0000 0000 0000 0000 0000 0000 0001

 取反:  1111 1111 1111 1111 1111 1111 1111 1110

  加1:1111 1111 1111 1111 1111 1111 1111 1111 = 2^32-1


免責聲明!

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



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