一個由於算術移位帶來的錯誤

來源:互聯網
上載者:User

近日在網上發現一段有趣的程式,統計一個整形變數的二進位形式裡面1的個數.這個程式不但有趣,而且還是非常有用的,比如資料通訊中的同位,就需要統計資料裡面1的個數,可見這段程式還是非常有意義的.

這段程式是這樣寫的,寫的非常精妙:

int bitCount(short input)
{
    int n_ret   = 0;

    /* 只要 input 不為0,則迴圈判斷 */
    while (0 != input)
    {
        /* 如果 input & 1 == 1 則表示最低位為1,反之則等於0 */
        if (input & 1)
        {
            n_ret++;
        }
        input = input >> 1;
    }

    return n_ret;
}

當時看了這段代碼,有種感覺,這段代碼由於參數是有符號整形,那麼在右移運算在很多編譯系統上都是算術右移,那麼While迴圈會陷入死迴圈,永遠也不可能退出來.

算術右移是這樣一種移位規則 : 對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位補1.

邏輯右移則是最高位總是補0的右移;

有符號數的右移運算是採用算術右移還是邏輯右移取決於編譯系統的規定。Turbo C和很多系統規定為補1。經過在Microsoft VC++裡面驗證,VC++和Turbo C一樣,也是採用算術右移的策略。

那麼上述代碼是不能夠在VC++裡面正常啟動並執行。

如果想讓代碼能夠在VC++裡面正常的工作,只要改動參數的類型就可以了,把該函數的函數頭改為如下:

int bitCount(unsigned short input)

這樣改動之後,在VC裡面完全正常,無論是傳給它unsigned short 還是short ,都能夠正常運行,當傳short給它的時候,類型是不匹配的,這個時候它的自動類型轉換規則是:按位拷貝。

聯繫我們

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