目录
移位
>> --- 右移操作符
右移操作符代码的使用
代码验证
算术右移和逻辑右移
验证Visual Studio使用的是算术右移还是逻辑右移
逻辑右移 or 算术右移的代码验证
右移操作符对正整数有除2的效果(除2是整数除法的除2)
验证
<< --- 左移操作符
左移操作符移动规则
左移操作符代码的使用
代码验证
移位
- 移动的是数据存储在内存中的二进制位,移动的也就是数据的补码
- 关于数据补码的相关知识请见:整数的二进制表示形式:原码、反码、补码-CSDN博客
- 注意:移位操作符的操作数只能是整数
>> --- 右移操作符
右移操作符代码的使用
int a = 15;
int b = a >> 1;
a >> 1:可理解为a存储在内存中的二进制补码向右移动一个bit位
且a为正整数,所以a的原码、反码、补码是相同的
a向右移一个bit位后,最低位的1就要被舍去,最高位的符号位要补全,补全有两种补全方式,算术右移和逻辑右移,下方会解释
代码验证
由以上的图画可得知,a向右移一位后赋值给变量b
那么b的值应该为7,因为1*2^0 + 1*2^1 + 1*2^2 = 7
变量a的值没有改变,由此可得出结论:位移操作符不会改变操作数的值
算术右移和逻辑右移
- 算术右移:右边丢弃,左边补原来的符号位
- 逻辑右移:右边丢弃,左边直接补0
- C语言没有给出明确的规定,一般编译器上采用的是算术右移
- 注意:丢弃的、操作的、右移的都是数据的补码
验证Visual Studio使用的是算术右移还是逻辑右移
int a = -15;
int b = a >> 1;
printf("b = %d\n", b);
(-15)存储在变量a中的补码:
当Visual Studio为算数右移后(a >> 1)的结果:
原码最高位是符号位,最高位为1,表示的是负整数,且1*2^3 = 8
所以(a >> 1)后的算术右移结果为:-8
当Visual Studio为逻辑右移后(a >> 1)的结果:
最高位将会直接补0,那么(a >> 1)后的逻辑右移结果为:8
逻辑右移 or 算术右移的代码验证
由此可见Visual Studio使用的是算术右移
右移操作符对正整数有除2的效果(除2是整数除法的除2)
关于整数除法的相关知识请见:算数操作符(除法操作符和取模操作符)-CSDN博客
验证
int a = 15;
int b = a >> 1;
int c = b >> 1;
<< --- 左移操作符
左移操作符移动规则
左边丢弃,右边直接补0(注意:操作的、丢弃的、左移的都是数据的补码)
左移操作符代码的使用
int a = 6;
int b = a << 1;
a的补码以及(a<<1)后的补码:
代码验证
- 变量a的值没有被改变,由此得出结论:左移操作符不会改变操作数的值
- 左移操作符对整数有乘2的效果
写die我了差点,创作不易,麻烦各位大佬点个关注和赞赞(必回关),蟹蟹