关于对c++位运算符的理解

建议先看案例,想一想,看看你能做对吗?

案例一:

先看以下案例:

#include<iostream>
using namespace std;
int main(){
    unsigned char a=0xA5;
    char b=~a>>4+1;
    printf("b=%d\n",b);
    return 0;
}

案例分析:

1.unsigned char a=0xA5;

//无符号char类型,取值范围0 -255,十六进制在计算机存储的为补码,其补码为10100101,

2.char b=~a>>4+1;

//赋值运算符,先算等式的右边,运算法则:unsigned char 在运算过程中会转换为unsigned int,涉及到数据扩容,低字节向高字节扩容,简便方法,(未考虑到无符号)看最高位最高位为1,前面全补1;最高位为0,前面全补0【正数补0,负数补1】

//可得出10100101,转换为的补码为00000000 00000000 00000000 10100101

//涉及到运算符的优先级,~按位取反运算符的优先级为2,+运算符的优先级为5,而>>右移运算符的优先级为6,先算按位取反,再算加法,最后算右移

//~按位非,所以结果变为11111111 11111111 11111111 01011010

//赋给char类型,char占一个字节,即8个比特位,涉及到数据缩小(字节缩小)高字节向低字节扩容,简便方法,低字节占几位,从最低位开始,取这么多位就行

//11111111 11111111 11111111 01011010,右移5位,00000111 11111111 11111111 11111010

//11111010 赋给char型b,只保留最后8位,11111010存储的是补码。

3.printf("b=%d",b);

//printf()是io流的一个库函数,遇到%d的输出格式符,输出十进制,十进制输出的是其原码,所以要将其补码转换为原码,得出的原码为10000110,其结果为-6;

//所以打印输出的结果为-6

案例二:

先看以下案例:

#include<iostream>
using namespace std;
int main(){
    char a=0xab;
    char b=~a>>4+1;
    printf("b=%d\n",b);
    return 0;
}

案例分析:

1.char a=0xab;

//char类型,占一个字节,即8个比特位,取值范围为-128 ~127

//十六进制在定义的是补码;,补码为10101011;

2.char b=~a>>4+1;

//根据优先级,~按位取反运算符的优先级为2,+算术运算符的优先级为5,>>右移运算符的优先级为6,赋值运算符的优先级为15,先算按位取反,再算加法,然后算右移,最后算赋值

//运算总法则:char型在运算过程中,会转换成int类型,进行数据扩容,这里涉及到数据的扩容,原先的补码为10101011,进行数据扩容后为:11111111 11111111 11111111 10101011【正数,前面全补0,负数全补1】

//先做按位取反的操作,得到的结果为:00000000 00000000 00000000 01010100

//再算加法,4+1=5;

//然后算右移,右移5位,00000000 00000000 00000000 00000010 【正数高位补0,负数高位补1】

//最后算赋值,char 只占8个比特位,所以将最后8位赋给char类型的变量b

3.printf("b=%d",b);

//printf();库函数,为io流的一个方法,遇到输出格式符%d,输出为十进制的数,将其转换为原码,正数的原码和补码相同,所以输出的结果为2;

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值