黑马程序员技术交流社区

标题: 关于负数的二进制表现形式。 [打印本页]

作者: 李哲    时间: 2012-3-25 15:35
标题: 关于负数的二进制表现形式。
6的二进制表现形式是110,也就是0000-0000 0000-0000 0000-0000 0000-0110。
-6二进制表现形式是6的二进制表现形式取反加1。0000-0000 0000-0000 0000-0000 0000-0110取反得到1111-1111 1111-1111 1111-1111 1111-1001,
再加1就是1111-1111 1111-1111 1111-1111 1111-1010。

但是1111-1111 1111-1111 1111-1111 1111-1010不也表示2的32次方减一,再减去(1111-1010)吗?也就是2的32次方减6?

这是怎么回事?
作者: 戴振良    时间: 2012-3-25 15:49
本帖最后由 戴振良 于 2012-3-25 15:52 编辑

"但是1111-1111 1111-1111 1111-1111 1111-1010不也表示2的32次方减一,再减去(1111-1010)吗?也就是2的32次方减6?"
你上面这句话是从哪里看来的,我看的不是很明白,总之在内在里开头是1它就是个负数,用1个字节(8位)的数字举例:
1111 1111   这是-1
1111 1110   这是-2
1111 1101   这是-3
1111 1100   这是-4
……
1000 0010   这是-126
1000 0001   这是-127
1000 0000   这是-128
这很奇怪吧,没办法,人家这样规定的
一个内存里的负的二进制数,我们一眼看不出它是10进制的多少,但是可以算出来,也就是用这个二进制减1,再取反就得到原码,接着按我们正的数那样算就知道是多少了
如1111 1101这是多少呢?先减1得1111 1100,再取反得1000 0011(符号位是不取反的),除去符号位的1,我们看剩下的000 0011不就是3吗?所以内存里的2进制1111 1101它对应的10进制就是-3。
作者: 李哲    时间: 2012-3-25 15:57
我刚看了课程,猜到原因。就是说,负数的二进制第一位必然为1,正数第一位必然为0。
正因为这样的设计,int类型才表示负的2的31次方到正的2的31次方减1。而不是负的2的32次方到正的2的32次方减1。
我上面的"但是1111-1111 1111-1111 1111-1111 1111-1010不也表示2的32次方减一,再减去(1111-1010)吗?也就是2的32次方减6?"说法是错误的。
这是我猜测。
因为老师讲课说:int类型表示负的2的31次方到正的2的31次方减1!
作者: 李哲    时间: 2012-3-25 15:59
也就是第一位是用来表示正负,而不是用于计数。
猜测啊,哪位前辈给回答一下?
作者: 贠(yun)靖    时间: 2012-3-25 16:57
    在计算机中负数是以补码形式存在的    负数的补码  是取负数的正数 也就是绝对值  取反   然后在加一  就是负数的补码
比如  -1 的补码
  1的绝对值   00000000  00000000 00000000  00000001
  取反         11111111  11111111 11111111  11111110
+1                 11111111 11111111  11111111  11111111
最终的-1的补码就出来了       要想得到实际的负数是多少  反响运算就可以了
    其实不管正数负数都是以补码的形式存在在计算机中的  只不过正数的补码还是原来的正数而已


      
作者: 马强    时间: 2012-3-25 18:54
正数正常表示,而负数(也就是首位为1)才取反加1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2