为什么c语言中-10>>2+3的值为-1

如题所述

1、做这个题,首先要知道,整数在计算机中是用补码来存放的。

以一个字节整数为例:

    -10 的原码为 10001010       第一位是符号位(1表示负数,0表示正数),其余位表示数值

    -10 的反码为11110101        符号位不动,其余位按位取反

    -10的补码=反码+1= 1 1110101 +1 = 11110110

2、>>运算符的意义

>>运算符是位运算符,是个双目运算符(双目运算有左右两个操作数), >>表示将左操作数右移,移动的位数由右操作数确定。

运算规则:右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。(一般是补符号位)

3、运算符优先级(这个是规定)

根据优先级规定,可知+运算符高于>>运算符,要先算2+3=5,再算-10 >> 5 ;

4、计算-10>>2+3

-10>>2+3=-10>>5 = 11110110 >>5 = 11111111   移出位丢弃,高位补符号位1

补码 11111111转换为原码(实际数值) 为 -1

    先得到反码:11111111-1=11111110

    再得到原码:10000001 即:-1

所以,-10>>2+3 = -1
PS:为了避免优先级记不清楚,在编程时,应尽可能的加上括号,以提高程序的可读性,以免出现不应该的低级错误,如:-10>>2+3写成-10>>(2+3)会让人更容易理解一些。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-10

首先,得搞清楚右移操作符">>"和加操作"+"的优先级:(优先级部分截图)

可见+操作优先级高,所以这个问题也就是为什么-10>>5的值为-1了

-10的二进制表示为"10110",将其右移,因为原来是负数,所以左边高位用“1填补”,一共移动五次:

    “11011”

    “11101”

    “11110”

    “11111”

    “11111”

"11111"表示的就是-1,所以值为-1

追问

为什么10的二进制是1010,而-10是10110?

追答

这个是补码的表示方式呀,计算机中的二进制是补码运算,举个例子,10是1010,前面符号位为0,即01010,-10为10110,这样的话,01010+10110就是00000,最高位溢出一个1,00000即为0,而如果只是在前面简单的加上一个符号位,0为正,1为负的话,10是01010,-10为11010,这样的话运算结果是不对的。所以,计算机中采用补码运算方式,而-10也就是10110了。
刚刚搜了一下,找到了一篇讲关于为什么计算机内部是用补码表示的,您可以参考一下:
然后另外一个讲移位操作的:
这里面讲的东西详细解释这道题的结果足够了。

追问

是我智商太拙计么。。。10是01010,符号位不变,取反加1不该是01011,为什么要再倒过来呢?

还有,我从百度百科上看到的这个怎么不倒过来?

追答

10的二进制表示:01010,取反:10101,+1得到的是:10110额,没有倒过来啊(取反的意思是0变1,1变0,不是说把原来的二进制数位逆序的意思啊)
百度百科的按位取反也就是这个意思的,所以不是倒过来(而且,这个里面是用得"-7"的原码取反的,我是用的7的二进制码去反的,所以也没有你贴的图里面的栗子中讲负数符号位不变的问题)

本回答被提问者采纳
第2个回答  2014-01-11
不仅-10>>2+3=-1,而且-10>>4也=-1,-10>>6就更是-1了。这是因为
1.计算机中的整数都是用补码表示的,从最高位开始向右与到第一个0前是全1。
2.右移是保持最高位不变向事移的,就是说右移时从最高位填入的一直是1。
3.无论类型是多少字节,全1都是-1的补码。
另外在-10>>2+3中,+的优先级高于>>,所以-10>>2+3的意思是-10>>5而不是-10>>2再+3;-10的补码是11110110,右移4位则是11111111,右移5位也是11111111,所以-10>>2+3=-1。
第3个回答  2014-01-10
这就得从优先级说起了,在-10>>2+3这个式子中,从左到右优先级依次降低,转换为逻辑就是-10右移2位后的数字加上3,首先10的逻辑为1010(二进制),右移后0010,加上符号位,就是-2,再加上3,就是1了
,不懂可以再问追问

程序运行后输出是-1,我问的也是-1。。。

第4个回答  2014-01-10

    首先+的优先级比>>高,因此上述表达式变为-10>>5

    计算机内部存的是补码

    负数的补码等于其绝对值的原码取反加1

    移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)

    因此步骤如下:

    10的原码                     0000 0000 0000 0000 0000 0000 0000 1010
    取反                            1111  1111  1111  1111  1111  1111 1111  0101
    加1得到-10的补码:   1111  1111  1111  1111  1111  1111 1111  0110
    向右移5位,前面补1:1111 1111  1111  1111  1111  1111  1111 1111

    这个数就是计算机内部-1的表示

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网