3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
右側(cè)的負(fù)整數(shù)是C語言中未定義的行為。
ISO 9899:2011 6.5.7逐位移位運(yùn)算符:
對每個(gè)操作數(shù)執(zhí)行整數(shù)提升。結(jié)果的類型是提升的左操作數(shù)的類型。如果右操作數(shù)的值為負(fù)或大于或等于提升的左操作數(shù)的寬度,則行為未定義。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
正如其他成員已經(jīng)回答的那樣,它會(huì)產(chǎn)生未定義的行為。我想在這里提一下,你引用這本書(“在一臺(tái)機(jī)器上”)似乎是偏袒的。它沒有概括行為。該書也可能已經(jīng)解釋了該行為未按照標(biāo)準(zhǔn)定義。順便說一句,我剛剛通過“新C標(biāo)準(zhǔn) - 經(jīng)濟(jì)和文化評論”并發(fā)現(xiàn)了這一說法:
英特爾奔騰SAL指令(由gcc和Microsoft C ++生成以評估左移)僅使用移位量的后五位
這很好地解釋了為什么-5的左移可能導(dǎo)致左移27(對于負(fù)數(shù)的2的補(bǔ)碼表示)

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
int main()
{
unsigned int a = 1;
printf("%u\n",a<<(-1));
return 0;
}
輸出為2147483648。
這是我的假設(shè)和驗(yàn)證:(只是假設(shè)?。?/p>
1.“<<”右操作數(shù)必須是unsigned int類型,
首先,(int)“-1”將被轉(zhuǎn)換為(unsigned int)“ - 1”。原因int類型是二進(jìn)制補(bǔ)碼表示,結(jié)果將是2 ^ 32-1(unsigned int)
2.由于數(shù)字2 ^ 32-1大于最大位移數(shù)字,2 ^ 32 - 1將是mod 32,等于27
我還嘗試了一些其他的nagetive右操作數(shù),并且?guī)в屑俣ㄒ?guī)則的手動(dòng)計(jì)算結(jié)果與我的IDE的產(chǎn)品相同。
我試圖找到一些支持的官方文件,女巫可以證實(shí)我的假設(shè)是否正確。也許你可以告訴我。
- 3 回答
- 0 關(guān)注
- 535 瀏覽
添加回答
舉報(bào)