我想知道 C/C 位移運算子的正確右手運算元是什么。
在撰寫本文時,內置算術型別都小于 256 位,因此單個位元組就足夠了。此外,x86 移位指令使用imm8. 總之,這表明右側運算元應該是 anunsigned char并且在這里使用不同的型別將需要型別轉換。
這里有“最正確”的型別嗎?我知道標準對位移位的其他方面出奇地寬容,所以也許這是另一種相同的情況?
uj5u.com熱心網友回復:
任何整數型別都可以用作按位移位的右運算元,只要該值至少為 0 且小于左運算元的位長。
這在C 標準的第 6.5.7 節 p2 和 p3 中關于按位移位運算子有詳細說明:
2每個運算元應具有整數型別
3對每個運算元執行整數提升。結果的型別是提升的左運算元的型別。如果右運算元的值為負或大于或等于提升的左運算元的寬度,則行為未定義。
因此,雖然 an 的范圍unsigned char應該足以容納任何有效值,但int無論如何都會提升正確的運算元。
uj5u.com熱心網友回復:
?往往想要做的一切,至少int,因此這將是非常驚人的,如果RHS的<<和>>將被指定為unsigned short或unsigned char。
很難想象為什么程式員會在那里使用long(或者,上帝幫助我們,long long),但我只是嘗試了以下代碼:
int main()
{
int x = 16;
long int y = 2;
int z1 = x << y;
int z2 = x >> y;
printf("%d %d\n", z1, z2);
long long int y2 = 2;
z1 = x << y2;
z2 = x >> y2;
printf("%d %d\n", z1, z2);
}
我在兩個編譯器下編譯它,都沒有給出任何警告,兩個程式都列印了64 4. (不是結論性的測驗,而是提示性的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367255.html
