对于408考研的同学,先抛结论:
对于左移操作符,不区分逻辑左移和算数左移,统统要移动符号位!!!,只有右移才分逻辑右移和算数右移
即:左移不区分逻辑左移和算数左移
左移不区分逻辑左移和算数左移
左移不区分逻辑左移和算数左移
重要的事情说三遍!!!
这里是很多 408考生已经错的一处知识点,如果你是考研的学生看到这里,就可以退出了,记住这个结论就行。
下面我用代码给大家证明一下上述结论:
注:环境为64位系统下的visual studio2019
#include<stdio.h>
int main() {
// 选择一个有符号整数作为例子
int value = -10; // 以-10为例
// 逻辑左移
int logicalLeftShiftedValue = (unsigned)value << 1;
// 算术左移
int arithmeticLeftShiftedValue = value << 1;
printf("原始值:%d\n", value);
// 打印逻辑左移和算数左移的结果
printf("算术左移结果:%d\n", arithmeticLeftShiftedValue);
printf("逻辑左移结果:%d\n", logicalLeftShiftedValue);
printf("-----------------------------------------------------\n");
// 逻辑右移
int logicalRightShiftedValue = (unsigned)value >> 1;
// 算术右移
int arithmeticRightShiftedValue = value >> 1;
// 打印逻辑右移和算数右移的比较结果
printf("算术右移结果:%d\n", arithmeticRightShiftedValue);
printf("逻辑右移结果:%d\n", logicalRightShiftedValue);
return 0;
}
输出结果:
由补码的符号扩展可知(数值相等): ffff fff6 = f6 = 1111 0110;ffff ffec = ec = 1110 1100; 符合定律