二进制下的正数、负数、小数、乘法溢出、精度丢失

一、原码、反码、补码

https://www.cnblogs.com/red-code/p/6520462.html
正数的原码、反码、补码都是相同的。
负数的原码:负数的绝对值的二进制的最高位变为1。
负数的反码:负数的原码的最高位不变,其余取反。
负数的补码:负数的反码+1。
例:
1.正数 9 (0000 1001 = 23+20=9)
原码:0000 1001
反码:0000 1001
补码:0000 1001
2.负数 -9
原码:1000 1001 (绝对值9的最高位变成1)
反码:1111 0110 (原码的最高位不变,其余取反)
补码:1111 0111 (反码+1)

二、负数的十进制、二进制转换

https://blog.csdn.net/onewalkingman/article/details/3746154

  1. 负数的十进制转二进制

负数的十进制转二进制(=取负数的补码):先取原码,再取反码,最后加一
-9的绝对值 0000 1001 取原码变成 1000 1001,再取反变成1111 0110,再加一变成1111 0111

  1. 负数的二进制转十进制(跟上面相反)

负数的二进制转十进制:减一取反或者取反加一
1111 0111 减一变成 1111 0110,再取反变成 0000 1001=9,最后加上符号-9。
或者
1111 0111 取反变成 0000 1000,再加一变成 0000 1001=9,最后加上符号-9。

三、小数的十进制、二进制转换

http://www.cnblogs.com/xkfz007/articles/2590472.html

  1. 十进制整数转换为二进制整数(除2取余,逆序排列)

例:86=0101 0110
86÷2=43…0
43÷2=21…1
21÷2=10…1
10÷2=5…0
5÷2=2…1
2÷2=1…0
1÷2=0…1

  1. 十进制小数转换为二进制小数(乘2取整,顺序排列)

例:0.8125=0.1101
0.8125x2=1.6250 取整:1
0.6250x2=1.2500 取整:1
0.2500x2=0.5000 取整:0
0.5000x2=1 取整:1

86.8125=0101 0110.1101

四、8位二进制的取值范围

在计算机中数据用补码表示,计算和存储:
8位无符号整数可以表示0~255
8位二进制原码的表示范围:-127~+127
8位二进制反码的表示范围:-127~+127
8位二进制补码的表示范围:-128~+127

五、乘法溢出

Java 中的 int 总共就 32 位,正数上限的情况首位也只能是 0,其他位都可以是 1(就是 231-1 的情况)。但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且很快就忘了这是溢出情况,把它按照正常的方式输出了,于是就成了负的。其实也不能怪它,它没有办法自动处理超过溢出的情况,因为 32 位是固定的,它不能因为溢出而临时扩展到 33 位之类的。
这不仅在 Java,在任何语言中都是这样的。所谓数值溢出就会出现这个现象。
231 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
231 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648
以上是负数的情况。溢出变成 0 的话道理也一样。
你想如果一个数大到最后 32 位都是 0 了,那计算机只能把它认作 0。这种情况有很多,例如 2^32 就是一共 33 位,首位 1,后面 32 位都是 0。

六、精度丢失

根本原因在于,数学意义上的小数不是每个都能用二进制在有限位数内精确表示的。
像 0.1,1.1 这样的小数没有精确的二进制表示,当然求和就不是1.2了。
我们把 0.1 转成二进制表示:
0.00011001100110011001100110011001100110011001100110011001 10011…
无限循环,说明0.1无法在有限位数中精确的表示。
半精度(16bit):11 位有效数字
单精度(32bit):24 位有效数字
双精度(64bit):53 位有效数字
四精度(128bit):113 位有效数字
因此二进制在有效位数内也会四舍五入:
0.00011001100110011001100110011001100110011001100110011001
所有在浮点数计算过程中,会产生精度丢失的情况。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值