我遇到了这个C代码,在线GCC编译器在线编译和执行,并收到-5作为输出。我改变了常数的值并得到了不同的结果,但无法弄清楚输出背后的逻辑。请帮忙......
#include<stdio.h>
int main()
{
int a = -10;
a = a>>1;
printf("%d", a);
return 0;
}
答案 0 :(得分:3)
在带有两个补码的二进制表示法中,a
看起来像这样:
111..1110110
现在,正确的转变已经完成。对于有符号整数,它是实现特定的填充位具有的值; GCC承诺&#34;理智的行为&#34;,即做arithmetic right shift - 符号位(此处1
)被扩展。
整数上的算术右移将该整数除以2 ^ n(n是移位大小) - 无论符号如何。
因此,班次产生新值:
111..1111011
哪个是-5
。翻转所有位并添加一位会产生000...00101
,即5
。
逻辑转变会产生
011..1111011
对于32位整数具有值2147483643
。请注意该值如何取决于您执行操作的整数的大小。
答案 1 :(得分:1)
>>
是右移操作员。
>>1
向右移1位。您可以找到详细的讨论here。对于结果,右移相当于除以2。
答案 2 :(得分:1)
答案 3 :(得分:1)
根据C标准(6.5.7按位移位算子)
5 E1&gt;的结果&gt; E2是E1右移E2位位置。如果E1 有一个无符号类型或E1有一个有符号类型和一个非负 值,结果的值是商的整数部分 E1 / 2E2。 如果E1有签名类型和负值,则 结果值是实现定义的。
似乎你的实现促进了符号位..
所以-10可以表示为(为简单起见,我假设sizeof(int)等于4)
-10
11111111 11111111 11111111 11110110
10 >> 1
11111111 11111111 11111111 11111011
最后一个值等于-5。 为了确保它等于5,你可以得到它的双补码值,计算为
~a + 1
a
11111111 11111111 11111111 11111011
~a
00000000 00000000 00000000 00000100
~a + 1
00000000 00000000 00000000 00000101
0101是5的二进制表示。
答案 4 :(得分:0)
&#39;&gt;&gt;&#39; operator是一个按位右移运算符(http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts),它有效地进行了“除以2”。
在
a = a >> 1;
语句将数字向右移位。
答案 5 :(得分:0)
这是一个位操作a = 01010当你做一个&gt;&gt; 1时你说你的程序向右移一位,你的结果是00101。
答案 6 :(得分:0)
>>
表示&#34;右移&#34;整数值的位数。它相当于&#34; / 2&#34; (除以2)。
10
的二进制表示形式为1010
。 -10
的二进制表示是它的2补码:11110110
(假设为8位)。右移1位变为11111011
,这是101
的2补码,或者是十进制的5。所以,(-10 >> 1) == -5
。
答案 7 :(得分:0)
-10 = 11110110
如果您执行&gt;&gt; 1 那么a = -5
-5 = 11111011
如果您执行&gt;&gt; 2 那么a = -3
-3 = 11111101
因此,&gt;&gt;正在将二进制数转换为一位,在开始时加1,