在Visual Studio編譯下面的C代碼後,結果爲4。如果我們按位移整數大於其大小,會發生什麼
void main() { int c = 1; c = c<<34;}
如從上Visual Studio中拆卸窗口看到的彙編代碼是
shl eax,22h
從組件,它很容易看到,我們正在轉變34.由於整數這裏是4個字節,從結果很顯然,模運算是在機器級別上進行的,使得這項工作以2的速度移動。
我想知道這種行爲是跨平臺標準化還是跨平臺不同?
在Visual Studio編譯下面的C代碼後,結果爲4。如果我們按位移整數大於其大小,會發生什麼
void main() { int c = 1; c = c<<34;}
如從上Visual Studio中拆卸窗口看到的彙編代碼是
shl eax,22h
從組件,它很容易看到,我們正在轉變34.由於整數這裏是4個字節,從結果很顯然,模運算是在機器級別上進行的,使得這項工作以2的速度移動。
我想知道這種行爲是跨平臺標準化還是跨平臺不同?
未定義的行爲發生。這是通過語言標準標準化的(參見1999年C標準的6.5.7 Bitwise shift operators
部分)。然而,UB的可觀察效果並不標準化,並且可能會有所不同。
至於shl eax, 22h
,移位計數將被CPU截斷爲5位(請參閱文檔),並且該指令的行爲實際上爲shl eax, 2
。
它說關於截斷的地方? http://download.intel.com/products/processor/manual/325462.pdf – 2013-04-20 16:34:24
@LefterisE就在那裏,在'卷。 2B','SAL/SAR/SHL/SHR-Shift'部分:計數操作數可以是立即數或CL寄存器。計數被屏蔽到5位(如果在64位模式下並且使用REX.W,則爲6位)。計數範圍限制在0到31之間(如果使用64位模式和REX.W,則爲63)。「你在哪裏尋找它,爲什麼? – 2013-04-20 16:38:02
我想確認你說的是什麼,以upvote你的答案 – 2013-04-21 12:50:40
結果是未定義如果換檔表達的右操作數是負的,或者如果將右操作數是大於或等於位在(促進)左操作數中的數。如果右操作數爲零(0),則不執行移位操作。
如果我們將main聲明爲void main(){...}'會怎樣? – wildplasser 2013-04-20 16:22:17
你在哪個體系結構下運行該程序? i386? – 2013-04-20 16:30:09
它的x86-64,但我的窗口是32位。 – 2013-04-20 16:32:47