黑马程序员技术交流社区

标题: 负数二进制问题 [打印本页]

作者: 党巾水    时间: 2012-4-2 18:46
标题: 负数二进制问题
在学习入学前自学的视频的时候,遇到一个问题。
毕老师讲到负数的二进制首位都是1。
我遇到一个数字

十进制:4294839808  
二进制:1111-1111-1111-1110-0000-1110-0000-0000

它的负数
十进制:-4294839808
二进制:0000-0000-0000-0001-1111-0010-0000-0000

这个负数的二进制首位是0,请问为什么?还是我哪里弄错了?谢谢!

PS:我是零基础起步~~

{:soso_e100:}
作者: 孙利川    时间: 2012-4-2 19:01
本帖最后由 孙利川 于 2012-4-2 19:05 编辑

1111-1111-1111-1110-0000-1110-0000-0000
这个数占四个字节,可以认为是个int类型,它表示的值是负127488
而数值4294839808超出了int的范围,可以用long类型表示,它的二进制值是:
0000-0000-0000-0000-0000-0000-0000-0000-1111-1111-1111-1110-0000-1110-0000-0000
首位为零表示正数,而-4294839808的二进制值为:
1111-1111-1111-1111-1111-1111-1111-1111-0000-0000-0000-0001-1111-0010-0000-0000
首位为1,表示负数
作者: 党巾水    时间: 2012-4-2 19:05
明白了!谢谢楼上的达人们~{:soso_e179:}
作者: 陈苓    时间: 2012-4-2 19:15
负数的二进制就是这个数的整数二进制取反加1,底层是是二进制在做运算。
负数的二进制的最高时1

比如 :-6
         0000-0110
取反  1111-1001
加1  +0000-0001   
--------------------------
        1111-1010        -6

作者: niceBoy    时间: 2012-4-2 22:07
数值超出int范围
用整数的时候要注意类型的取值范围,整数默认是int类型,小数默认是double
作者: 郑苑东    时间: 2012-4-2 22:21
超出了int类型。。就好比把一个i超出nt类型的数。。强制放到了int类型里面。int是四个字节。。32位。所以放下只有后面的三十二个。也就是你看到的结果。
作者: 欧阳才志    时间: 2012-4-2 23:20
不管是正数还是负数,在机器里都是以补码的形式存在的。正数的补码就是二进制本身不变,负数的补码是二进制取反再加1,且规定最高位符号位为1.
作者: 王永旺    时间: 2012-4-3 00:43
超出int类型的范围了,其实你可以大概估算一下二进制的位数。
2的十次方为1024,也就是十进制说每增加三位数,对应二进制增加大概十位。
4,294,839,808这样的数字,最起码得用32位以上的二进制表示。,
作者: 葛尧    时间: 2012-4-3 13:49
本帖最后由 葛尧 于 2012-4-3 13:50 编辑

在汇编 C等 里这个就叫溢出了。结果会超出预想,是不安全的。
不过安全的java在这里可以检测到这么大个数 int是放不下的,不会让你编译通过的




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