黑马程序员技术交流社区

标题: 请教一下,负数用二进制怎么表示? [打印本页]

作者: 刘俊强    时间: 2014-4-10 18:32
标题: 请教一下,负数用二进制怎么表示?
今天遇到一个问题,不知道用二进制怎么表示负数,请大神指点一下。

作者: show_play    时间: 2014-4-10 18:33
-7的二进制  1000 0111
-13的二进制1000 1101
一个数你可以把它当成是正数, 也可以把它当成是负数, 就看你的需要了

在有符号数中二进制最高位是1的就是负数, 0就是正数
作者: vincentgood    时间: 2014-4-10 18:45
负数在内存中表示就是取反再加1,比如6,在内存中的二进制是0000-0000 0000-0000 0000-0000 0000-0111,负6就是取反再加1,在内存中的表示是1111-1111 1111-1111 1111-1111 1111-1001,
作者: 最喜蛋炒饭    时间: 2014-4-10 19:01
对于补码来说,其实就是最前一位为1,最高位表示符号位正为0,负为1,在数值上,除去最高位,正负数是一样的,负数可以由正数按位取反,然后加1就行!
作者: 清风木扬    时间: 2014-4-10 19:02
1号位是符号位。0正,1负。
用负数对应的正数的补码表示。
        System.out.println(Integer.toBinaryString(1));  
         System.out.println(Integer.toBinaryString(-1));
输出结果:
   1
11111111111111111111111111111111


作者: LHP    时间: 2014-4-10 20:11
在计算机中,负数以其正值的补码形式表达。

什么叫补码呢?这得从原码,反码说起。

 

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 00000101 是 5的 原码。

 

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。

 

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011


所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。


再举一例,我们来看整数-1在计算机中如何表示。

假设这也是一个int类型,那么:


1、先取1的原码:00000000 00000000 00000000 00000001

2、得反码:     11111111 11111111 11111111 11111110

3、得补码:     11111111 11111111 11111111 11111111


可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF
作者: Mokill0911    时间: 2014-4-11 16:05
LHP 发表于 2014-4-10 20:11
在计算机中,负数以其正值的补码形式表达。

什么叫补码呢?这得从原码,反码说起。

基本的这个大哥都说的差不多啦。

简单解释一下就是首先将需要变成负数都的二进制数前面用0补足32位;

然后对整个数进行取反,0取反得1,将32位二进制数取反完毕之后得数加1;

按照二进制运算原则,0加1得1,1加1进一位。

这样就能得到你希望变成负数得二进制表现形式了。
作者: 刘俊强    时间: 2014-4-11 20:19
show_play 发表于 2014-4-10 18:33
-7的二进制  1000 0111
-13的二进制1000 1101
一个数你可以把它当成是正数, 也可以把它当成是负数, 就看你 ...

是不是我也可以这样理解
1000 0001 可以看作十进制的-1也可以看作十进制的129?是这样么?
作者: 李程    时间: 2014-4-12 13:03
写出绝对值的二进制,然后各位取反,最后加一
作者: 无此姓名    时间: 2014-4-13 18:32
本帖最后由 无此姓名 于 2014-4-13 18:36 编辑

简单说就是牺牲掉一用作标志位。楼主可以看一下我的帖子:关于原码、反码、补码,以及计算机中负数的表示原理 http://bbs.itheima.com/thread-109226-1-1.html
一直很纳闷这篇帖子为什么没给技术分,虽然这些东西实际开发中完全没用,但我写的非常认真啊。:(

作者: chensc    时间: 2014-5-2 08:02
学习学习!




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