-1的二進位表示

來源:互聯網
上載者:User

雖然一直用C/C++,但很少涉及到Bit序列的問題。比如,-1的二進位表示到底是怎樣的?從沒有深究過,一直都是模稜兩可的,說出來實在讓人笑話。

對於有符號整型數的簡單認識就是,最高位為符號位,0為正,1為負,那麼剩下幾位應該如何表示呢?理所當然的認為,既然是1表示為0000 0001(假設為8位整型數,下同),那麼-1就應該表示為1000 0001了。

但是,在C語言裡,-1的正確表示應該是1111 1111,即0xFF。因為C語言裡,對整型數是採用Two’s complement標記法,而前面我的理解則是Sign-Magnitude標記法(浮點數採用該法)。在Two’s complement標記法裡,1000 0001表示的是-127。

幾個特殊值,比如:正值的最大表示為0111 1111,即127。負值的最小表示為1000 0000,即-128。

並因此帶來幾個有趣的現象,比如從8位有符號數轉成16位有符號數的填充問題。以前想當然的是填0,但這是錯的,應該是填充符號位的值。比如-1=0xFF填充符號位1就應該變成0xFFFF。而如果填充的是0,那麼變成0x80FF就不對了。

Two’s complement是不對稱的。一個數的正負值表示,除了最高位之外,其餘位元也是不盡相同的。在C語言裡,當在無符號數和有符號數之間進行轉換的時候,數值的二進位序列是不會改變的,改變的只是對該序列的解讀模式。比如有符號數-1轉換成無符號數就變成了255,雖然其二進位表示都是0xFF。如果不理解這一點,就會出Bug。

對於C/C++程式員,的確有必要研讀《深入理解電腦系統》(Computer Systems: A Programmer's Perspective)。

聯繫我們

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