2013-04-20 40 views
2

在Visual Studio編譯下面的C代碼後,結果爲4。如果我們按位移整數大於其大小,會發生什麼

void main() { int c = 1; c = c<<34;} 

如從上Visual Studio中拆卸窗口看到的彙編代碼是

shl eax,22h 

從組件,它很容易看到,我們正在轉變34.由於整數這裏是4個字節,從結果很顯然,模運算是在機器級別上進行的,使得這項工作以2的速度移動。

我想知道這種行爲是跨平臺標準化還是跨平臺不同?

+0

如果我們將main聲明爲void main(){...}'會怎樣? – wildplasser 2013-04-20 16:22:17

+0

你在哪個體系結構下運行該程序? i386? – 2013-04-20 16:30:09

+0

它的x86-64,但我的窗口是32位。 – 2013-04-20 16:32:47

回答

5

未定義的行爲發生。這是通過語言標準標準化的(參見1999年C標準的6.5.7 Bitwise shift operators部分)。然而,UB的可觀察效果並不標準化,並且可能會有所不同。

至於shl eax, 22h,移位計數將被CPU截斷爲5位(請參閱文檔),並且該指令的行爲實際上爲shl eax, 2

+0

它說關於截斷的地方? http://download.intel.com/products/processor/manual/325462.pdf – 2013-04-20 16:34:24

+1

@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

+0

我想確認你說的是什麼,以upvote你的答案 – 2013-04-21 12:50:40

2

根據this article on MSDN

結果是未定義如果換檔表達的右操作數是負的,或者如果將右操作數是大於或等於位在(促進)左操作數中的數。如果右操作數爲零(0),則不執行移位操作。

相關問題