如果我有以下幾點:向左移位運算符
char v = 32; // 0010 0000
然後我做的:
v << 2
數量becames負。 // 1000 0000 -128
予讀出的標準,但它是僅寫爲:
如果E1有一個簽名的類型和非負的值,E1×2 E2是在結果類型 表示的,然後那是最終的價值;否則,行爲是不確定的。
所以我不明白是否是一個規則,如果最左邊的位有點去 號碼必須開始否定。
我正在使用GCC。
如果我有以下幾點:向左移位運算符
char v = 32; // 0010 0000
然後我做的:
v << 2
數量becames負。 // 1000 0000 -128
予讀出的標準,但它是僅寫爲:
如果E1有一個簽名的類型和非負的值,E1×2 E2是在結果類型 表示的,然後那是最終的價值;否則,行爲是不確定的。
所以我不明白是否是一個規則,如果最左邊的位有點去 號碼必須開始否定。
我正在使用GCC。
左移兩次會給1000 0000) = 128)。
如果128是在可表示的char
即你在一些機器(具有支撐編譯器),其提供大小> 8個比特的char
然後128將是您獲得的值(因爲它是在這樣的類型表示的)。
否則,如果char
的大小與大多數常用機器一樣只是8位,對於使用二進制補碼錶示負值的帶符號字符類型,[-128,127]是可表示的範圍。你處於未定義的行爲狀態,因爲它不能表現爲這種類型。
但是,如果[-128,127]是可表示的範圍,爲什麼我處於未定義的行爲。看起來GCC提供了正確的結果,因爲char在該範圍內。 – xdevel2000
@ xdevel2000:E1×2^E2表示數學上的正確結果,而不是位移。 – mafso
我認爲你把數學和計算機表示混淆了。忽略一下,我們正在CPU上這樣做。如果你手動移動00100000,你會得到10000000.這個數字在十進制系統中的值是多少,128。現在來到128的計算機表示,是否有可能用8位來表示它?是的,但只有當所有8位可用於表示,即只在'unsigned char'上。 – legends2k
簽名的數據基元像char使用二進制補碼(http://en.wikipedia.org/wiki/Twos_complement)來編碼值。您可能正在尋找的是無符號字符,它不會使用二進制補碼(無負數)對值進行編碼。
嘗試使用無符號的字符,而不是字符使用較少的位來表示你的角色,通過使用無符號的字符,你利用爲代表你的性格
unsigned char var=32;
v=var<<2;
轉移兩次更多的比特給你'1000 0000',和第一位是符號位。 –
@ShafikYaghmour,printf(「%d \ n」,(char)(v << 2)); – xdevel2000