黑马程序员技术交流社区
标题:
关于负数的二进制表现形式。
[打印本页]
作者:
李哲
时间:
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