黑马程序员技术交流社区

标题: 刚学习,问个负数在二进制中的存储方式。 [打印本页]

作者: 过午不食    时间: 2013-11-27 13:15
标题: 刚学习,问个负数在二进制中的存储方式。
本帖最后由 过午不食 于 2013-11-30 16:57 编辑

负数的二进制码是按照原码取反+1得来。
举个例子啊,十进制数10的二进制码是1010.那么-10的二进制码就是取反+1,为0101+1=0110.
而十进制数6的二进制码也是110.跟-10的二进制码不是一样了吗?计算机是怎么区分的?
作者: 过午不食    时间: 2013-11-27 13:18
想明白了。10是0000000000001010,-10是1111111111110101+1=1111111111110110,6是0000000000000110.只看到后面的。忘记了前面的。

作者: 王雷1    时间: 2013-11-27 13:25
+10的原码:00001010
-10的原码:10001010
-10的反码:11110101(-10的原码符号位不变,其余位按位求反)
-10的补码:11110110(-10的反码末位+1)
而6的是00000110
其实我家里连网都没有,视频多看看就Ok 了,呵呵
作者: 过午不食    时间: 2013-11-27 13:38
王雷1 发表于 2013-11-27 13:25
+10的原码:00001010
-10的原码:10001010
-10的反码:11110101(-10的原码符号位不变,其余位按位求反)

-10是以11110110存储的。但是11110110同时也是246的原码。那计算机怎么知道是-10还是246?
作者: 王雷1    时间: 2013-11-27 13:51
过午不食 发表于 2013-11-27 13:38
-10是以11110110存储的。但是11110110同时也是246的原码。那计算机怎么知道是-10还是246? ...


-10前面还有1呢,我没写而且而246前面是0。是在不行你就用电脑的计算器算下就知道了
作者: 王雷1    时间: 2013-11-27 13:58
过午不食 发表于 2013-11-27 13:18
想明白了。10是0000000000001010,-10是1111111111110101+1=1111111111110110,6是0000000000000110.只看到 ...

聪明的孩子
作者: 李文帅    时间: 2013-11-27 13:59
应该用32位二进制未表示吧
10的原码应该是:00000000 00000000 00000000 00001010
10的反码是:       11111111 11111111 11111111 11110101
10的补码是:       11111111 11111111 11111111 11110101 + 1 =
                            11111111 11111111 11111111 11110110
所以-10的二进制表示形式为:
                            11111111 11111111 11111111 11110110
作者: 过午不食    时间: 2013-11-27 14:22
李文帅 发表于 2013-11-27 13:59
应该用32位二进制未表示吧
10的原码应该是:00000000 00000000 00000000 00001010
10的反码是:       1111 ...

-10的二进制码是11111111 11111111 11111111 11110110,4294967286的二进制码也是11111111 11111111 11111111 11110110.我就是问这个。我想应该是范围的问题吧。表示不到4294967286。32位,应该最大的正数能表示到2的31次方。所以11111111 11111111 11111111 11110110只能表示-10.表示不了4294967286。
作者: 汪洋大海    时间: 2013-11-27 16:32
                System.out.println(Integer.MAX_VALUE);//int类型的最大值
                System.out.println(Integer.MIN_VALUE);//int类型的最小值
作者: 贺奕凯    时间: 2013-11-27 16:37
如果问题已经解决,请编辑帖子修改为:“提问结束”
作者: 冯晓骏    时间: 2013-11-28 22:56
对于整数:Java 有三种表现形式

十进制:0-9,满10进1
八进制:0-7,满8进1
十六进制:0-9,A-F,满16进1,用0x开头表示。
二进制

二进制:0-1,满2进1,现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现
二进制的发明非常伟大,有很多含义,将来有机会单独发一篇博客追溯二进制的来龙去脉
IP地址每一段是一个字节表示,每个字节是8位二进制位,这样来操作数据节省很多内存
进制转换:

无论什么进制,在内存中其实都是用二进制表示的,只不过显示的方式不一样,所以转换的时候,无论什么进制都看做是一个二进制数就可以了,后期的移位操作也是基于二进制的,所以用二进制作为基础进行进制转换比较方便。

十六进制就是每四个二进制位表示一位

八进制就是每三个二进制位表示一位

所以

任何进制------>十六进制:每四位一截取
任何进制------>八进制:每三位一截取
任何进制------>二进制:每一位一截取
任何进制------>十进制:默认表现形式,直接打印便是十进制数
特殊情况:

负数------>二进制(负数的二进制表现形式)

简单来说,一个字节只能表示256个数,如果无符号,则是0-255,如果有符号,则首位是符号位,0表示正数,1表示负数,则能表示的正数负数各一半,也就是0-127,即0000-0000--->0111-1111,那么剩下的二进制数则表示负数,这里引进了补码的概念,简单说就是二进制是没有符号的,所以表示负数的二进制数是其正数的一个补充数字,那么从1000-0000--->1111-1111分别对应的是-128- (-1),补码的计算是由该负数的反码(原码取反)+1,原码则是绝对值的二进制。




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