c位操作操作不';t乘字符
我有一个简单的代码,为什么它会返回这个随机字符c位操作操作不';t乘字符,c,char,bit,C,Char,Bit,我有一个简单的代码,为什么它会返回这个随机字符 #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) #包括 int main() { 字符c='1'; printf(“%c\n”,c); c=c整数'1
#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)
#包括
int main()
{
字符c='1';
printf(“%c\n”,c);
c=c整数'1'
有值49
。因此,它的左移位c,因为'1'
和1
不是一回事。'1'
是表示数字1
的字符文字,表示字符'1'
的基础值取决于使用的字符集
例如,在ASCII中,字符1
由十进制值49(十六进制0x31)表示。因此,假设ASCII,c=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;
}
似乎您正在尝试访问c的下一个字符值。当您执行语句c=c时,请在此处检查您的答案“c标准不保证'1'+1将产生'2'”-是的,它会。第5.2.1节,():“在源和执行基本字符集中,上述十进制数字列表中0后的每个字符的值应比前一个字符的值大一个"'0'
到'9'
保证是连续的standard@AndrewHenle对不起,我把它和a
。z
混淆了。没有标准化的字符集,其中'0'
到'9'
是不连续的。但字母的情况不同。在C'0'
到中e> “9”必须是连续的,他是用4乘以,而不是2。@LưuVĩnhPhúc,正如我所解释的。但他问“为什么不返回2?”,意思是他打算用2乘以。
int main()
{
char c = 1;
printf("%c\n", c+'0');
c = c << 1;
printf("%c\n", c+'0');
return 0;
}
#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
c = (int)c + 1; //By force conversion from character to integer to get the ASCII value