我有这个简单的代码,为什么它会返回这个随机字符?
#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 :(得分:3)
因为'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;
}
答案 1 :(得分:1)
整数'1'
的{{3}}值为49
。因此左移,c<<2
生成196
,然后将其分配回char
变量c
。如果char为char
,它将溢出signed
。
这可能是您的平台上发生的事情,打印随机字符。
不确定为什么您希望位移产生2
。如果您想要字符'2'
,则只需将{1}添加到c
。
c = c+1;
答案 2 :(得分:1)
向左移动一次将值乘以2.向左移动两次将值乘以4.因此,首先,即使代码正确,您也无法获得答案2
。 / p>
现在详细说明。您正在使用打印格式%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
答案 3 :(得分:1)
您似乎正在尝试访问c的下一个字符值。执行语句c = c << 2
实际发生了什么:
1
的ASCII值为49
)然后两次乘以2(c << 2
基本上是左移2,第一次左移使得原值乘以2,第二次左移使结果乘以2)196
而不是2
存储在c中。你应该做什么:
您只需将1
添加到变量c,因为它会将字符转换为ASCII,然后将1
添加到其中,即字符c
具有ASCII值{{ 1}},当它递增时,新值将为49
,当转换为字符时,它等于2。试试这个:
50
希望这有帮助。