C语言中位运算符问题 这句话怎么解释啊
发布网友
发布时间:2022-04-24 02:36
我来回答
共2个回答
热心网友
时间:2023-10-22 09:03
这句话的理解有这样一个基础,那就是右移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++,对于带符号数的右移运算就采取了补符号位的方式。
热心网友
时间:2023-10-22 09:03
这句话的理解有这样一个基础,那就是右移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++,对于带符号数的右移运算就采取了补符号位的方式。
热心网友
时间:2023-10-22 09:04
当x为负数时,由于符号位为1,右移时,DEV C++系统是规定最高位补1。
例如,-8=11111000B
-8>>2=11111110B
即-8>>2=-2,满足了与正数同样的运算结果,即x>>2的值,等于x/(2^2)。
+8>>2=+2
00001000 >>2 ==> 00000010
热心网友
时间:2023-10-22 09:03
这句话的理解有这样一个基础,那就是右移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++,对于带符号数的右移运算就采取了补符号位的方式。
热心网友
时间:2023-10-22 09:04
当x为负数时,由于符号位为1,右移时,DEV C++系统是规定最高位补1。
例如,-8=11111000B
-8>>2=11111110B
即-8>>2=-2,满足了与正数同样的运算结果,即x>>2的值,等于x/(2^2)。
+8>>2=+2
00001000 >>2 ==> 00000010
热心网友
时间:2023-10-22 09:04
当x为负数时,由于符号位为1,右移时,DEV C++系统是规定最高位补1。
例如,-8=11111000B
-8>>2=11111110B
即-8>>2=-2,满足了与正数同样的运算结果,即x>>2的值,等于x/(2^2)。
+8>>2=+2
00001000 >>2 ==> 00000010
热心网友
时间:2023-10-22 09:03
这句话的理解有这样一个基础,那就是右移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++,对于带符号数的右移运算就采取了补符号位的方式。
热心网友
时间:2023-10-22 09:04
当x为负数时,由于符号位为1,右移时,DEV C++系统是规定最高位补1。
例如,-8=11111000B
-8>>2=11111110B
即-8>>2=-2,满足了与正数同样的运算结果,即x>>2的值,等于x/(2^2)。
+8>>2=+2
00001000 >>2 ==> 00000010