A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 党巾水 中级黑马   /  2012-4-2 18:46  /  2548 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习入学前自学的视频的时候,遇到一个问题。
毕老师讲到负数的二进制首位都是1。
我遇到一个数字

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

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

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

PS:我是零基础起步~~

{:soso_e100:}

9 个回复

倒序浏览
本帖最后由 孙利川 于 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,表示负数
回复 使用道具 举报
明白了!谢谢楼上的达人们~{:soso_e179:}
回复 使用道具 举报
负数的二进制就是这个数的整数二进制取反加1,底层是是二进制在做运算。
负数的二进制的最高时1

比如 :-6
         0000-0110
取反  1111-1001
加1  +0000-0001   
--------------------------
        1111-1010        -6
回复 使用道具 举报
数值超出int范围
用整数的时候要注意类型的取值范围,整数默认是int类型,小数默认是double
回复 使用道具 举报
超出了int类型。。就好比把一个i超出nt类型的数。。强制放到了int类型里面。int是四个字节。。32位。所以放下只有后面的三十二个。也就是你看到的结果。
回复 使用道具 举报
不管是正数还是负数,在机器里都是以补码的形式存在的。正数的补码就是二进制本身不变,负数的补码是二进制取反再加1,且规定最高位符号位为1.
回复 使用道具 举报
超出int类型的范围了,其实你可以大概估算一下二进制的位数。
2的十次方为1024,也就是十进制说每增加三位数,对应二进制增加大概十位。
4,294,839,808这样的数字,最起码得用32位以上的二进制表示。,
回复 使用道具 举报
本帖最后由 葛尧 于 2012-4-3 13:50 编辑

在汇编 C等 里这个就叫溢出了。结果会超出预想,是不安全的。
不过安全的java在这里可以检测到这么大个数 int是放不下的,不会让你编译通过的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马