char类型参与运算实质

又是新的一天,让我分享我新的知识吧。
如果有不足希望大家来改正,欢迎评论。

例题

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位(这跟电脑大小端系统有关,我们常用的为小端系统)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值