c語言中無符號和有符號之間的運算

來源:互聯網
上載者:User

標籤:有符號 無符號

關於電腦中有符號,無符號數值的表示以及它們之間的運算 是基本知識,但工作這麼多年也不敢說完全搞明白透徹。

這幾天在將知識點進行了一些梳理,並做了一些有意思的實驗。


電腦中,數值的表示和運算都是用補碼錶示的。 正數的補碼就是其本身; 負數的補碼則是最高符號位為1,其餘位取反加1. 比如-5表示為0xFFFB, 而5則表示為0x0005。

這裡,第一個需要注意的問題就是 有符號數和無符號數之間的運算。 c語言規定,先一律轉成無符號數,然後再進行運算。

比如,  int iValue1 = -5;  unsigned int uValue2 = 2;    則 iValue1+uValue2的值和(unsigned int)iValue1 + uValue2一樣,都為0xFFFD


還有一個意思的話題就是 有符號數值之間的除法 跟右移不是等價的。 比如 -5/4 是不等於 -5>>2  前者的結果是0xFFFF  而後者為 0xFFFE

先解釋前者, 對於有符號數的相除,它實際等式為 (-5+4-1) >>2 = (0xFFFB+0x03)>>2=0xFFFF 有符號的算術右移,空出來的高位都用MSB符號位取代;

就後者而言, -5>>2 就是直白的算術右移, 轉換為 0xFFFB>>2=0xFFFE


最後要強調的是 對於無符號數的除法和右移則是等價的, 比如 5/4 = 5>>2

c語言中無符號和有符號之間的運算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.