二进制与浮点数
补数可以简单对应到十进制中的相反数,如 10与-10互为相反数;
而在二进制中就是用正数来表示的负数,可能这话不太好理解
在二进制表示负数值时,一般会把最高位作为符号来使用,0:表示正数,1:表示负数
看个例子
在 计算机中减法的实现其实就是通过补数的方式 实现的,
比如1-1 = 0 => 1 + (-1) = 0 ,计算时全部转成二进制计算
正数的移位基本和十进制是一样的,左移一位是1x10,计算机就是1x2,所以左移就是2的n次方;
左移低位都是补0;
负数的左移,如 -14 << 2 = -56
正数十进制右移一位是1x0.1,计算机就是1x0.5(2的-1次方),所以右移就是2的n次方分之一;
右移正数高位都是补0;
当负数时,若该数值是用补数表示的负数值,则右移后的所有高位补1
负数的右移,如 -14 >> 2 = -4
在计算机中表示小数是采用浮点数表示法,所以像1011.0011这样的小数形式,完全都是在纸上运算的结果。
浮点数是指用符号、尾数、基数和指数这四部分来表示的小数.其规定小数点前面的值固定为1的正则表达式.
IEEE规定的浮点数
十进制数0.5,用浮点数表示
二进制数0.11,用浮点数表示
尾数部分:用的是将小数点前面的值固定为1的正则表达式;
指数部分:用的是EXCESS系统表现法,是指根据指数部分的最大值的一半,得出中间值,记作0,使得负数不需要用符号来表示(不知道为什么这样设计);
计算机中计算小数的时候其实都是按照下面存储计算的,并非采用IEEE规定的浮点数表示法,所以我认为EXCESS系统表现方式就是为了方便与浮点数表示法做互相转化的.
程序中常用的浮点数double与float内部构造(IEEE-754规定)
从IEEE的规定的构造中得出,
双精度的有效尾数是52位,另加1位(该位即小数点前的1,但是实际内存中不会存储,这是约定),即53位,2^53,对应到十进制的 10^15 ~ 10^16,所以在十进制中有效位是15位
而单精度的有效尾数是23位,另加1位,即24位,2 24,对应到十进制的10 7 ~ 10^8,所以十进制中有效位是7位
这里再举一个例子
再按上面所说的,再计算下 float a = 6.7 在计算机内存中是如何存储的
即10公里差1厘米,这样的误差可以忽略不计
就是把小数x10、x100先扩大计算,再缩小;
可以简单看看Java中BigDecimal的实现
见下图
从图中看到BigDecimal的就是通过扩大小数的倍数来计算的;
https://en.wikipedia.org/wiki/Binary-coded_decimal
总结记录结束!!!