移位操作符、位操作符和整型提升详解
创作时间:
作者:
@小白创作中心
移位操作符、位操作符和整型提升详解
引用
CSDN
1.
https://blog.csdn.net/2402_89035880/article/details/145663791
本文详细介绍了移位操作符、位操作符和整型提升的概念和使用方法。通过具体的代码示例和二进制运算的详细解释,帮助读者理解这些操作符的工作原理。
移位操作符
左移操作符( << )
左移操作符( << )的规则: 左边抛弃,右边补零
#include <stdio.h>
int main()
{
int a = 10;
//00000000000000000000000000001010 -- 10的原码/反码/补码
int b = a << 1;
//a向左移动一位
//移位后
//00000000000000000000000000010100 -- 补码
//00000000000000000000000000010100 -- 原码
//b = 20
printf("a = %d\n", a);
printf("b = %d\n", b);
//a向左移动一位,但a的值不变
return 0;
}
右移操作符( >> )
右移操作符( >> )的规则: 逻辑右移、算术右移
1.逻辑右移: 左边用0填充,右边丢弃
2.算术右移: 左边用原该值的符号位填充,右边丢弃
右移到底是采用逻辑右移还是算数右移是取决于编译器的,
大部分编译器采用算术右移
#include <stdio.h>
int main()
{
int a = -10;
//10000000000000000000000000001010 -- -10的原码
//11111111111111111111111111110101 -- -10的反码
//11111111111111111111111111110110 -- -10的补码
int b = a >> 1;
//a向右移动一位
//1.假设是逻辑右移
//01111111111111111111111111111011 -- 补码
//01111111111111111111111111111011 -- 原码
//可知b是一个非常大的正数
//2.假设是算术右移
//11111111111111111111111111111011 -- 补码
//10000000000000000000000000000101 -- 原码
//b = -5
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
注意:对于移位运算符,不要移动负数位,这个是标准未定义的。
#include <stdio.h>
int main()
{
int a = 1;
int b = a << -1;//err
return 0;
}
位操作符
按位与( & )
按位与 &
对应的二进制位上,有0就是0,都是1才为1
int main()
{
int a = -8;
int b = 6;
int c = a & b;
//10000000000000000000000000001000 -- -8的原码
//11111111111111111111111111110111 -- -8的反码
//11111111111111111111111111111000 -- -8的补码
//00000000000000000000000000000110 -- 6的原码/反码/补码
//a & b 后
//00000000000000000000000000000000 -- c的原码/反码/补码
//c = 0
printf("c = %d\n", c);
return 0;
}
按位或( | )
按位或 |
对应的二进制位上,有1就是1,都是0才为0
int main()
{
int a = -8;
int b = 6;
int c = a | b;
//10000000000000000000000000001000 -- -8的原码
//11111111111111111111111111110111 -- -8的反码
//11111111111111111111111111111000 -- -8的补码
//00000000000000000000000000000110 -- 6的原码/反码/补码
//a | b 后
//11111111111111111111111111111110 -- c的补码
//10000000000000000000000000000010 -- c的原码
//c = -2
printf("c = %d\n", c);
return 0;
}
按位异或( ^ )
按位异或 ^
对应的二进制位上,相同为0,相异为1
int main()
{
int a = -8;
int b = 6;
int c = a ^ b;
//10000000000000000000000000001000 -- -8的原码
//11111111111111111111111111110111 -- -8的反码
//11111111111111111111111111111000 -- -8的补码
//00000000000000000000000000000110 -- 6的原码/反码/补码
//a ^ b 后
//11111111111111111111111111111110 -- c的补码
//10000000000000000000000000000010 -- c的原码
//c = -2
printf("c = %d\n", c);
return 0;
}
按位异或的特点
a ^ a == 0
0 ^ a == a
a ^ b == b ^ a 支持交换律
按位取反( ~ )
按位取反 ~
0变为1,1变为0
int main()
{
int a = -1;
int b = ~a;
//10000000000000000000000000000001 -- -1的原码
//11111111111111111111111111111110 -- -1的反码
//11111111111111111111111111111111 -- -1的补码
//按位取反操作后
//00000000000000000000000000000000 -- b的原码/反码/补码
//b = 0
printf("b = %d\n", b);
return 0;
}
整型提升
整型提升
1.有符号整数提升是按照变量的数据类型的符号位来提升的,提升的时候高位补符号位
2.无符号整数提升,高位补0
int main()
{
char a = 127;
//00000000000000000000000001111111 int类型的127的原码/反码/补码
//01111111 -> a的原码/反码/补码 截断后
//截断的原因:char类型是8个bit位,32个bit位放不下,所以要截断
char b = 5;
//00000000000000000000000000000101 int类型的5的原码/反码/补码
//00000101 -> b的原码/反码/补码 截断后
char c = a + b;
//整型提升
//char在vs编译器上默认是signed char 所以高位补符号位
//00000000000000000000000001111111 -> 整型提升后的a的补码
//00000000000000000000000000000101 -> 整型提升后的b的补码
//00000000000000000000000010000100 -> 相加后的补码
//10000100 -> c的补码 截断后
printf("%d\n", c);
//%d打印c的值 打印的是signed int 类型,c要整型提升,高位补符号位
//11111111111111111111111110000100 -> 整型提升后的补码
//10000000000000000000000001111011
//10000000000000000000000001111100 -> 原码
//-124
return 0;
}
热门推荐
汽车划痕蜡能修复划痕吗?详解使用条件与效果
人工智能+心理生理计算,赋能身心健康
草本花和木本花浇水有啥不同
手机一般贴什么膜比较好?普通保护膜、钢化玻璃膜、防窥膜,如何选择?
医生警告:长时间使用防窥膜可能损害视力
十款属牛人适合佩戴的首饰推荐 生肖牛适合戴什么配饰
供应链仿真遇上复杂系统理论:Amazon仿真数据科学家Yashar访谈精要
重庆璧山机场建设规划发布:2030年建成投用,年旅客吞吐量可达7000万人次
璧山新机场再传佳音,城市发展迎来新契机
乳糖不耐受就告别牛奶了吗?看看最新专家共识怎么说?
《繁花》同款美食在昆山:从大闸蟹到定胜糕,这些上海老味道也能在这里找到
中医专家详解:脑鸣与耳鸣有何不同?
中国免签国家增至38个,入境游升温成开放新名片
五行运转法则:中华传统文化的智慧结晶
农村老话说“宁可房屋出场小,不可门前有人田”,是啥意思?有道理吗?
能否通过尿检查出肾结石
香港机场巴士(城巴机场快线)详细攻略:路线、票价、停靠点全解析
身体出现这6种表现,说明你湿气过重!快停下这些“加湿”行为→
踝关节骨折合并韧带损伤的三种治疗方法比较:Meta分析结果
PVD镀膜:原理与工艺全解析,流程控制与应用价值的深度剖析
巴拿马:连接两大洲的“世界桥梁”
今年流行的“大衣+毛衣”,谁穿谁时髦
为什么我们还需要车载无线广播?
归脾丸的秘密:成分解析与功效详解
周灭商并不是为了讲人道、废人殉,周朝政治比商朝还恶劣
真正的商朝是我们很陌生的文明
如何在法律框架内有效保护自己:合法权益的边界与实践
如何提高火车票抢票成功率?九大实用技巧助你轻松购票
院校怎么选:大学分类与评价标准
旅游如何更精准规划?多个景区及文旅平台接入DeepSeek