黑马程序员技术交流社区
标题:
负数二进制问题
[打印本页]
作者:
党巾水
时间:
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