c++ int 負數 補碼 隱式類型轉換

來源:互聯網
上載者:User

標籤:取反   種類   符號   解釋   減法   輸出   技術分享   double   div   

    unsigned y = 1;    int x = -2;    cout << x + y << endl;

對於上述的結果為

這裡面有一個負數的補碼問題和不同類型之間的隱式類型轉換問題

 

首先負數的表示方法是負數的絕對值的二進位碼取反再加1,-2的補碼計算就是:

0000 0000 0000 0010->1111 1111 1111 1101->1111 1111 1111 1111 1110

而整數的加減在內部都是通過加運算實現的,主要原因是使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。 

1的二進位表示是:0000 0000 0000 0001

x + y在內部的二進位表示就是1111 1111 1111 1111

 

對於最後的類型又有一個隱式類型轉換的規則,兩個通用的指導原則如下:
    1、為防止精度損失,如果必要的話,類型總是被提升為較寬的類型。
    2、所有含有小於整形的有序類型的算術運算式在計算之前其類型都會被轉換成整形。

一般來說各種類型的轉換順序為 long double > double > float >=  int >= short > char,unsigned > signed 。

由於unsigned > signed,所以x+y被解釋為unsigned,最後輸出值就是2的32次方減一

 

int取值範圍

-2^31 ~ 2^31-1

為什麼負數是 -2^31 而不是-2^31-1呢?

因為規定了1000 0000, 0000 0000, 0000 0000, 0000 0000這個特殊的數(本來是-0的)為-2^31,所以負數就多一個

同理char類型的取值範圍為-128到127,在這裡也是把1000 0000表示為-128

c++ int 負數 補碼 隱式類型轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.