>> << 对于有符号的用算术运算, 无符号的用逻辑运算。
<< 左移算数逻辑都一样 高位全去掉(符号位也不保留),低位补0.
>>右移有点不同,算术的话高位会补符号位,10000001 >> 2 =11100001
逻辑的话 10000001 >> 2 =01100001
另外 1<<5-1 是1 << (5-1), 逻辑位移优先级低于加减乘除。
char , unsigned char 只有转为int ,unsigned int 这些需要补位的时候才有区别~
#include <stdio.h>
int main(){
int a,b;
unsigned n,m;
unsigned char uc;
char c;
uc = 0x7F;
c = 0x7F;
a =c;
b =uc;
n =c;
m = uc;
printf("%x,%x\n",a,b);
printf("%x,%x\n",n,m);
return 0;
}
输出是4个7f ,,大家都一样
#include <stdio.h>
int main(){
int a,b;
unsigned n,m;
unsigned char uc;
char c;
uc = 0xFF;
c = 0xFF;
a =c;
b =uc;
n =c;
m = uc;
printf("%x,%x\n",a,b);
printf("%x,%x\n",n,m);
return 0;
}
输出:
ffffffff,ff
ffffffff,ff
所以说char 补位的时候高位都会填充符号位的值, 即使转化成unsigned的时候也是如此。
而unsigned char 一律补0