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

 我来答
kaixingui2012
2015-09-18 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6506万
展开全部

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)会让人更容易理解一些。

缘来丶缘浅
2014-01-10 · TA获得超过790个赞
知道小有建树答主
回答量:187
采纳率:0%
帮助的人:268万
展开全部

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

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

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

  1. “11011”

  2. “11101”

  3. “11110”

  4. “11111”

  5. “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了。
刚刚搜了一下,找到了一篇讲关于为什么计算机内部是用补码表示的,您可以参考一下:http://blog.csdn.net/glgoober/article/details/6209540
然后另外一个讲移位操作的:http://blog.csdn.net/croop520/article/details/2702514
这里面讲的东西详细解释这道题的结果足够了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2014-01-11 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6716万
展开全部
不仅-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。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
亥凝思3q
2014-01-10 · TA获得超过313个赞
知道小有建树答主
回答量:400
采纳率:14%
帮助的人:174万
展开全部
这就得从优先级说起了,在-10>>2+3这个式子中,从左到右优先级依次降低,转换为逻辑就是-10右移2位后的数字加上3,首先10的逻辑为1010(二进制),右移后0010,加上符号位,就是-2,再加上3,就是1了
,不懂可以再问
追问
程序运行后输出是-1,我问的也是-1。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风追保罗
2014-01-10 · 超过29用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:63.2万
展开全部
  1. 首先+的优先级比>>高,因此上述表达式变为-10>>5

  2. 计算机内部存的是补码

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

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

  5. 因此步骤如下:

    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的表示

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式