对char的按位运算给出32位结果

Dum*_*tru 2 c char bitwise-operators

我一直用C编写一个程序,将char的前4位移到最后,最后4位移动到开头.对于大多数值,它正常工作,以及反向操作,但对于某些值,如8,x,y,z,它给出32位值.通过打印变量的十六进制值来检查值.任何人都可以解释为什么会这样吗?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char o, f,a=15;
    scanf("%c",&o);
    printf("o= %d\n",o);
    f=o&a;
    o=o>>4;
    printf("o= %d",o);
    o=o|(f<<4);
    printf("o= %x, size=%d\n",o,sizeof(o));
    f=o&a;
    o=o>>4;
    printf("o= %d",o);
    o=o|(f<<4);
    printf("o= %x, size=%d\n",o,sizeof(o));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

twa*_*erg 6

传递o作为参数传递给printf()在自动转换到的结果int,这是在系统上明显的32位.自动转换使用符号扩展,因此如果o设置了第7 位,则将设置转换结果中的位8-31,这将解释您所看到的内容.

您可以使用unsigned char而不是char避免这种情况.或传递o & 0xffprintf().