Var*_*nce 8 c bit-manipulation unsigned-char
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这个程序打印256?
据我所知,由于0x80 = 0b10000000,无符号字符有8位,因此左移后'1'应溢出,输出应为0,而不是256.
Bil*_*eal 14
这是C的整数提升规则的结果.从本质上讲,进入表达式的大多数变量都是"提升"的,因此这样的操作不会失去精度.然后,它通过作为int成printf,根据到C的可变参数的规则.
如果你想要你想要的东西,你必须回到unsigned char:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:使用%cStephen注释中的指定将不起作用,因为也%c需要一个整数.
编辑:或者,您可以这样做:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要么
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}
Run Code Online (Sandbox Code Playgroud)