C语言中位运算符问题 这句话怎么解释啊
2个回答
2016-11-22
展开全部
这句话的理解有这样一个基础,那就是右移n位相当于除以2的n次方,而这个基础就是对于无符号数来说的。
比如无符号数8,如果用8位二进制表示,就是二进制的0000 1000,
右移0位,也就是不移动,等于8,就等于8除以1,也就是8除以2的0次方;
右移1位,0000 0100 ,等于4,就等于8除以2,也就是8除以2的1次方;
右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
对于有符号数,最高位为符号位,>> 右移运算,移动的时候符号位会被同时移动。
比如有符号数的-8,如果用8位二进制补码表示,就是二进制的 1111 1000,
右移0位,也就是不移动,等于-8,就等于8除以1,也就是8除以2的0次方;
右移1位:
如果补1进来, 1111 1100 ,等于-4, 就等于8除以2,也就是8除以2的1次方;
如果补0进来, 0111 1100 ,等于124,就不等于8除以2了;
右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
如果补1进来, 1111 1110 ,等于-2, 就等于8除以4,也就是8除以2的2次方;
如果补0进来, 0011 1110 ,等于62,就不等于8除以4了;
右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
如果补1进来, 1111 1111 ,等于-1, 就等于8除以8,也就是8除以2的3次方;
如果补0进来, 0001 1111 ,等于31,就不等于8除以8了;
根据以上分析,对于带符号数负数,发现右移时有两种情况:补1(也就是符号位)进来,还能够保持除以2的n次方的关系成立;补0进来就不行。
不同的C编译系统根据自己的特点在这个问题上可能就采取了不同的办法。比如VC和DEV C++,对于带符号数的右移运算就采取了补符号位的方式。
比如无符号数8,如果用8位二进制表示,就是二进制的0000 1000,
右移0位,也就是不移动,等于8,就等于8除以1,也就是8除以2的0次方;
右移1位,0000 0100 ,等于4,就等于8除以2,也就是8除以2的1次方;
右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
对于有符号数,最高位为符号位,>> 右移运算,移动的时候符号位会被同时移动。
比如有符号数的-8,如果用8位二进制补码表示,就是二进制的 1111 1000,
右移0位,也就是不移动,等于-8,就等于8除以1,也就是8除以2的0次方;
右移1位:
如果补1进来, 1111 1100 ,等于-4, 就等于8除以2,也就是8除以2的1次方;
如果补0进来, 0111 1100 ,等于124,就不等于8除以2了;
右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
如果补1进来, 1111 1110 ,等于-2, 就等于8除以4,也就是8除以2的2次方;
如果补0进来, 0011 1110 ,等于62,就不等于8除以4了;
右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
如果补1进来, 1111 1111 ,等于-1, 就等于8除以8,也就是8除以2的3次方;
如果补0进来, 0001 1111 ,等于31,就不等于8除以8了;
根据以上分析,对于带符号数负数,发现右移时有两种情况:补1(也就是符号位)进来,还能够保持除以2的n次方的关系成立;补0进来就不行。
不同的C编译系统根据自己的特点在这个问题上可能就采取了不同的办法。比如VC和DEV C++,对于带符号数的右移运算就采取了补符号位的方式。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询