2014-06-12 87 views
1

如果我有以下幾點:向左移位運算符

char v = 32; // 0010 0000 

然後我做的:

v << 2 

數量becames負。 // 1000 0000 -128

予讀出的標準,但它是僅寫爲:

如果E1有一個簽名的類型和非負的值,E1×2 E2是在結果類型 表示的,然後那是最終的價值;否則,行爲是不確定的。

所以我不明白是否是一個規則,如果最左邊的位有點去 號碼必須開始否定。

我正在使用GCC。

+3

轉移兩次更多的比特給你'1000 0000',和第一位是符號位。 –

+0

@ShafikYaghmour,printf(「%d \ n」,(char)(v << 2)); – xdevel2000

回答

1

左移兩次會給1000 0000) = 128)。

如果128是在可表示的char即你在一些機器(具有支撐編譯器),其提供大小> 8個比特的char然後128將是您獲得的值(因爲它是在這樣的類型表示的)。

否則,如果char的大小與大多數常用機器一樣只是8位,對於使用二進制補碼錶示負值的帶符號字符類型,[-128,127]是可表示的範圍。你處於未定義的行爲狀態,因爲它不能表現爲這種類型。

+1

但是,如果[-128,127]是可表示的範圍,爲什麼我處於未定義的行爲。看起來GCC提供了正確的結果,因爲char在該範圍內。 – xdevel2000

+1

@ xdevel2000:E1×2^E2表示數學上的正確結果,而不是位移。 – mafso

+1

我認爲你把數學和計算機表示混淆了。忽略一下,我們正在CPU上這樣做。如果你手動移動00100000,你會得到10000000.這個數字在十進制系統中的值是多少,128。現在來到128的計算機表示,是否有可能用8位來表示它?是的,但只有當所有8位可用於表示,即只在'unsigned char'上。 – legends2k

1

簽名的數據基元像char使用二進制補碼(http://en.wikipedia.org/wiki/Twos_complement)來編碼值。您可能正在尋找的是無符號字符,它不會使用二進制補碼(無負數)對值進行編碼。

+0

那麼它應該工作,當轉變只有1,是正確的? – Binarian

+1

該標準不要求籤名類型作爲二進制補碼來實現。然而,轉換爲相應的無符號類型會產生有符號值的二進制補碼錶示。 – mafso

+1

@ViktorLexington是的,如果換檔只有一次,那麼它仍然是定義良好的,結果將是64. – legends2k

0

嘗試使用無符號的字符,而不是字符使用較少的位來表示你的角色,通過使用無符號的字符,你利用爲代表你的性格

unsigned char var=32; 
v=var<<2;