2015-08-03 40 views
-2

我有這個簡單的代碼,爲什麼它返回這個隨機字符?c位操作操作不會乘以字符

#include <stdio.h> 

int main() 
{ 
    char c = '1'; 
    printf("%c\n",c); 
    c = c << 2; 

    printf("%c\n",c); 

    return 0; 
} 



1 

? (some random character) 

爲什麼不返回2?

+0

這裏檢查你的答案 http://stackoverflow.com/questions/1097130/in-c-left-shift-char-0xff-by-8-and-cast-it-to-int – venki

回答

1

整數'1'具有ASCII49。所以左移,c<<2產生196然後被分配回char變量c。如果字符是signed,它將溢出char。 這可能是在您的平臺上發生的,打印隨機字符。

不知道你爲什麼期望位移產生2。如果你想要字符'2',然後簡單地加1到c

c = c+1; 
+0

「 C標準不保證'1'+1會產生'2'「 - 是的。第5.2.1節,(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):「在源和執行基本字符集中,每個字符後的值在上面的十進制數字列表中的0應該比先前的「 –

+0

http://stackoverflow.com/q/9416926/995714的值大1」到「9」的「0」保證是連續的C標準 –

+0

@AndrewHenle對不起。我很困惑它與'a' ..'z'。 –

3

因爲'1'1是不一樣的東西。 '1'是表示數字1的字符字面值,表示字符'1'的基礎值取決於正在使用的字符集。

例如,在ASCII中,字符1由十進制值49(十六進制0x31)表示。因此,假定ASCII,c = c << 2將值196(乘以4)分配給c。如果一個char被簽名並且長度爲8位(這通常是這種情況),這將溢出並調用未定義的行爲。

如果你想要它打印12你應該a)乘以2而不是4(即,移位1而不是2),並b)存儲數值而不是它的表示(但當然,那麼你需要打印時進行調整):

int main() 
{ 
    char c = 1; 
    printf("%c\n", c+'0'); 
    c = c << 1; 

    printf("%c\n", c+'0'); 

    return 0; 
} 
+0

沒有標準化的字符集,「0」到「9」不是連續的。儘管對於字母來說這是一個不同的故事。在C''0''到''9''上的 – Peter

+0

必須是連續的http://stackoverflow.com/q/9416926/995714 –

+0

@LưuVĩnhPhúc和彼得,很高興知道,謝謝。 –

1

左移一旦乘以2移位值的兩倍左乘以所以擺在首位的值乘以4,你肯定不會得到答案2即使代碼是正確的。

現在的細節。您正在使用的打印格式%c將該值顯示爲字符。 '1'的ASCII碼是49。如果乘以2,則得到98,這是'b'的ASCII碼。

你應該爲ASCII調整前和計算後:

#include <stdio.h> 

int main(void) 
{ 
    char c = '1'; 
    printf("%c\n", c); 
    c = c - '0';    // ASCII adjustment 
    c = c << 1;     // double 
    c = c + '0';    // ASCII adjustment 
    printf("%c\n", c); 
    return 0; 
} 

程序輸出:

1 
2 
+0

他將它乘以4,而不是2. –

+0

@LưuVĩnhPhúc,正如我所解釋的。但他問「爲什麼不返回2?」,這意味着他打算乘以2。 –

1

好像你正在試圖訪問C的下一個字符值。當您執行該語句c = c << 2

究竟發生了什麼:

  • 字符先轉換成整數(它自己的ASCII值)
  • 49(的1 ASCII值49)然後兩次乘以2(c << 2基本上是左移2,第一左移使原始值乘以2,第二左移使得結果乘以2)
  • 因此結果值是在類型轉換之後存儲在c中的196而不是2

你應該做的:

你應該簡單地添加1到變量c,因爲它會將字符轉換爲其ASCII,然後將增加1它即字符c有ASCII值49,當它被增加時,新值將是50,當轉換爲字符時等於2。試試這個:

c = (int)c + 1; //By force conversion from character to integer to get the ASCII value 

希望這會有所幫助。