求助关于一个简单的小程序 using System; class Test { public static void Main() { int x = -16; Console.WriteLine(x); int y = x>>2; Console.WriteLine(y); y = y>>2; Console.WriteLine(y);y = y>>2; Console.WriteLine(y); } } 运行结果是-16 -4 -1 -1 右移两位就是除2吧,那为什么最后一次-1右移的结果还是-1呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 右移不完全等于除以2,尤其对于负数来说,-1的补码表示是全1,再怎么右移也还是全1(移掉的空位补符号位,负数的符号位为1)。 1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。 数值的补码表示也分两种情况: (1)正数的补码:与原码相同。 例如,+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。 已知一个数的补码,求原码的操作分两种情况: (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 -16的补码是1111 0000右移2位后补码是:1111 1100,对应的数值是-4再右移2位后补码是:1111 1111,对于的数值是-1再右移2位后补码是:1111 1111,对于的数值是-1以后不论如何右移得到的数值都是-1另:右移运算时,高位用符号位补充 C#中获取光标位置的问题? 关于设计的问题 怎么实现鼠标拖拉图片或文件添加啊 SqlDataReader 读取记录问题 C#编写的Socket程序,listen成功,Accept成功,可就是接收不了数据 C#如何读取数据文件? 水晶报表的打包问题!!!!!!! C# 分布式开发 何处有msil的帮助下载? 关于float类型,很简单!· 两个datetime相减得到一个timespan可以吗? 数据库问题
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
右移2位后补码是:1111 1100,对应的数值是-4
再右移2位后补码是:1111 1111,对于的数值是-1
再右移2位后补码是:1111 1111,对于的数值是-1
以后不论如何右移得到的数值都是-1另:右移运算时,高位用符号位补充