用一句简单的话来说就是
逻辑移位不需要考虑符号位,算术移位需要考虑符号位,我们都知道。数在计算机中都是以补码的形式来存储的,这才造成了逻辑移位和算术移位的的差别。
这学期学习的单片机,看到的变量声明一直都是unsigned。这才明白了,为什么要定义为无符号,因为在程序中可能会用到移位运算。
看个简单的例子
10000010算术右移1位11000001 (算术移位时符号位不动)
10000010逻辑右移1位01000001
举个例子:
int funcl(unsigned word)
{
return (short)((word<<8)>>8);
}
word 机器数
0080H
00FFH
0100H
对题目进行简单的改造:
int funcl(unsigned word)
{
return ((short(word<<8))>>8);
}
short是一元运算符,<<是双目运算符 单目运算符的优先级高于双目运算符,
word 机器数
0080H
00FFH
0000H
int funcl(unsigned word)
{
return ((short)(word<<8)>>8);
}
word 机器数
0080H
00FFH
0100H