这个C程序背后的逻辑是什么?

时间:2014-09-10 07:33:36

标签: c

我遇到了这个C代码,在线GCC编译器在线编译和执行,并收到-5作为输出。我改变了常数的值并得到了不同的结果,但无法弄清楚输出背后的逻辑。请帮忙......

#include<stdio.h>
int main()
{
   int a = -10;
   a = a>>1;
   printf("%d", a);
   return 0;
}

8 个答案:

答案 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)

&gt;&gt;是右移操作员。它将位移到右边。

在这种情况下,它会移位1位。

检查herehere以了解详情。

另外,你可以找到  here计算器。

最后,作为&#34; Alter Mann&#34;提到,按位右移将等于整数除以2。

答案 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,