2012-10-15 85 views
0

可能重複:
Left shifting with a negative shift count輸出一個<< with -ve no?

考慮我的代碼如下

int main() 
{ 
    int k=1; 
    k=k<<-1; 
    printf("%d",k); 
} 

O/P

-2147483648

爲什麼輸出是這樣的。我知道負號是存儲在2's complement,但這裏有任何使用-2s補碼的概念。請給我一些想法。

+0

你想做什麼? – besworland

+0

你期望什麼?你正在轉向一個負指數,不是很有意義 – logoff

+1

這不能是你的完整代碼。對於一個你實際上並不存儲表達式'k << - 1'的結果的地方。 –

回答

3

k << -1; // Before the OP edit

k = k<<-1;

這些陳述C.

在逐位的右操作數使用負值未定義的行爲向左或向右移位運算是未定義的行爲在C中(見C99,6.5.7)。

+0

感謝您的回答,標準是否這樣說。 – pradipta

+0

@pradipta查看http://stackoverflow.com/questions/4945703/left-shifting-with-a-negative-shift-count從標準 – halex

+0

引用感謝您的鏈接 – pradipta

2

的原因-2147483648結果 - 如果你正在測試這個在x86處理器 - 是移位數被鉗位到31(見「英特爾架構軟件開發人員手冊第2卷:指令集參考「)。所以你得到了3138,它等於0x80000000,當它被打印爲一個有符號的32位整數變成-2147483648。

+0

感謝您的回答,但是-1如何在這裏變成31。 – pradipta

+0

-1是0xFFFFFFFF(32位)。所以,如果你在-1和31之間進行按位AND,你得到31。 – Michael

+0

謝謝,但它是如何得到AND與31. – pradipta

相關問題