我有這個簡單的代碼,爲什麼它返回這個隨機字符?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?
我有這個簡單的代碼,爲什麼它返回這個隨機字符?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?
整數'1'
具有ASCII值49
。所以左移,c<<2
產生196
然後被分配回char
變量c
。如果字符是signed
,它將溢出char
。 這可能是在您的平臺上發生的,打印隨機字符。
不知道你爲什麼期望位移產生2
。如果你想要字符'2'
,然後簡單地加1到c
。
c = c+1;
「 C標準不保證'1'+1會產生'2'「 - 是的。第5.2.1節,(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):「在源和執行基本字符集中,每個字符後的值在上面的十進制數字列表中的0應該比先前的「 –
http://stackoverflow.com/q/9416926/995714的值大1」到「9」的「0」保證是連續的C標準 –
@AndrewHenle對不起。我很困惑它與'a' ..'z'。 –
因爲'1'
和1
是不一樣的東西。 '1'
是表示數字1
的字符字面值,表示字符'1'
的基礎值取決於正在使用的字符集。
例如,在ASCII中,字符1
由十進制值49(十六進制0x31)表示。因此,假定ASCII,c = c << 2
將值196(乘以4)分配給c
。如果一個char
被簽名並且長度爲8位(這通常是這種情況),這將溢出並調用未定義的行爲。
如果你想要它打印1
和2
你應該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」到「9」不是連續的。儘管對於字母來說這是一個不同的故事。在C''0''到''9''上的 – Peter
必須是連續的http://stackoverflow.com/q/9416926/995714 –
@LưuVĩnhPhúc和彼得,很高興知道,謝謝。 –
左移一旦乘以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
他將它乘以4,而不是2. –
@LưuVĩnhPhúc,正如我所解釋的。但他問「爲什麼不返回2?」,這意味着他打算乘以2。 –
好像你正在試圖訪問C的下一個字符值。當您執行該語句c = c << 2
究竟發生了什麼:
1
ASCII值49
)然後兩次乘以2(c << 2
基本上是左移2,第一左移使原始值乘以2,第二左移使得結果乘以2)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
希望這會有所幫助。
這裏檢查你的答案 http://stackoverflow.com/questions/1097130/in-c-left-shift-char-0xff-by-8-and-cast-it-to-int – venki