c位操作操作不会乘以char

时间:2015-08-03 10:55:39

标签: 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)

为什么它没有返回2?

4 个答案:

答案 0 :(得分: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;
}

答案 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

实际发生了什么:

  • 首先将字符转换为整数(它自己的ASCII值)
  • 49(1的ASCII值为49)然后两次乘以2(c << 2基本上是左移2,第一次左移使得原值乘以2,第二次左移使结果乘以2)
  • 因此,在类型转换后,结果值为196而不是2存储在c中。

你应该做什么:

您只需将1添加到变量c,因为它会将字符转换为ASCII,然后将1添加到其中,即字符c具有ASCII值{{ 1}},当它递增时,新值将为49,当转换为字符时,它等于2。试试这个:

50

希望这有帮助。