Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c位操作操作不';t乘字符_C_Char_Bit - Fatal编程技术网

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