[英]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.