簡體   English   中英

左移計數為負數

[英]Left shifting with a negative shift count

這里到底發生了什么?

a << -5

顯然,它不正確地移動。 但是我正在讀的書說:

在一台機器上,該表達式實際上向左移27位

我的問題是; 為什么? 是什么導致左移27位? 當換擋計數為負時,到底發生了什么? 謝謝。

右側的負整數是C語言中未定義的行為。

ISO 9899:2011 6.5.7按位移位運算符:

對每個操作數執行整數提升。 結果的類型是提升后的左操作數的類型。 如果右操作數的值為負或大於或等於提升后的左操作數的寬度, 則行為不確定

正如其他成員已經回答的那樣,它會產生未定義的行為。 我想在這里提到的是,您從書中引用的內容(“在一台機器上”)似乎是不完整的。 它沒有概括行為。 該書可能還解釋了該行為未按照標准進行定義。 順便說一句,我剛通過“新C標准-經濟和文化評論”,發現以下說法:

Intel Pentium SAL指令(由gcc和Microsoft C ++生成,用於評估左移)僅使用移位量的低五位

這很好地解釋了為什么左移-5會導致左移27(對於負數的2的補碼表示)

該行為是不確定的。

在5位二進制算術中,二進制補碼-5具有與無符號+27相同的二進制表示形式,這可能解釋了該特定平台。

int main()
{
    unsigned int a = 1;
    printf("%u\n",a<<(-1));
    return 0;
}

輸出為2147483648。

這是我的假設和驗證:(只是假設!)

1。“ <<”右操作數必須為無符號int類型,

因此,首先,將(int)“ -1”強制轉換為(unsigned int)“-1”。 因為int類型是二進制補碼表示形式,結果將是2 ^ 32-1(unsigned int)

2.由於數字2 ^ 32-1大於最大位移數字,因此2 ^ 32-1將為mod 32,等於27

還嘗試了其他一些合適的右操作數,使用假定規則的手動計算結果將與我的IDE的乘積相同。

我正在嘗試查找一些輔助性官方文件,女巫可以驗證我的假設是否正確。 也許你可以告訴我。

如果您要移位的值是32位變量,則移位-5進入“循環”並向前移位27。 移位只能以“無符號”方式進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM