为什么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)会让人更容易理解一些。
为什么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
这里面讲的东西详细解释这道题的结果足够了。
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。
,不懂可以再问
程序运行后输出是-1,我问的也是-1。。。
首先+的优先级比>>高,因此上述表达式变为-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的表示