又是新的一天,让我分享我新的知识吧。
如果有不足希望大家来改正,欢迎评论。
例题
int main(){
unsigned char a = 0xa5;
unsigned char b = ~a >> 1 + 2 + 3;
printf ("%d\n", b);
}
答案为 253.
让我们分步来分析原因吧。
1.由题意,我们可以知道a=0xa5; 那我们来看看~a是什么吧。
4 unsigned char a=0xa5;
5 printf("%x\n",~a); //ffffff5a
重点:我们发现~a为 0xffff ff5a 这是为什么呢?
首先我们得明白char类型 本质为int,也就是说
char类型参与运算会自动转化成int类型。
2.其次我们得理解运算符得优先级,本题中 (~) > (+) > (>>),其他的优先级问题希望大家能够好好的去牢记。
>> 运算符是左移运算符,对于signed类型移出的
位补原来的符号位值,而对于unsigned类型的
一律补0.
3.接下来让我们来具体分析过程吧
unsigned char b=~a>>1+2+3;
=>unsigned char b=(0xffff ff5a )>>6;
=>unsigned char b=(1111 1111 1111 1111, 1111 1111 0101 1100 )>>6;
=>unsigned char b=0000 0011 1111 1111 ,1111 1111 1111 1101;
=>unsigned char b=1111 1101;
=>unsigned char b=253;
由于b为char类型,我们截取低8位(这跟电脑大小端系统有关,我们常用的为小端系统)