数字存储与计算

https://media.githubusercontent.com/media/irisHYT/ImageHosting0/main/images/1690861871031.webp

计算机存储数字的全部采用补码,计算也使用补码计算,当定义有符号的整型值为0,在计算机内的存储的补码二进制为00000000,进行取反计算后补码结果会变成11111111,进而通过有符号的补码转换为反码是10000000,再+1为10000001,转为十进制的结果就是-1

整型

计算机使用补码对整型进行存储与计算,正数的反码和补码都是它自己,负数的反码为除了符号位取反,补码为反码减1。

浮点数型

计算机对浮点数的存储是通过固定宽度的符号域,指数域和尾数域,任意一个浮点数字可以通过下面的形式表示

$$Value=(-1)^s*M*2^E$$

其中s为符号位的值,当s==0为正数,s==1为负数,M表示有效数字,即尾数域的值,取值范围为(1,2),整数部分固定为1,所以整数部分的1被省略,只存储小数部分的值,E表示指数位。

对于float32而言,s符号位占用1字节,M尾数域占用23字节,E指数域占用8字节。

对于float64而言,s符号位占用1字节,M尾数域占用52字节,E指数域占用11字节。

E指数

E的类型为无符号的整型数字,对于8位的E,取值范围为[0,255],对于11位的E,取值范围为[0,2047],为了能让E表示负数,IEEE 745规定真实的E的值必须减去一个中间数,对于8位这个中间数位127,对于11位这个数字是1024

M指数

表示浮点数转换为二进制后,除去首位的1剩余部分的数值。

规定

E的每一位都是0时,真实计算的E'=1-127/1023,并且M中被省略的1降级为0,这样做是为了表示±0以及接近0的很小的数字。

E的每一位都是1时,如果M中全都为0,表示±无穷大;如果M不是全部为0,则表示这不是一个数(NaN)。

$$eg: float32$$
$$3.25 = 11.01 = 1.101 * 2^1$$
$$M = 101$$
$$E = 1+127 = 128 = 10000000$$
$$S = 0$$
binary = 0 10000000 1010 0000 000000000000000

构造正负无穷大

1var inf_64_0 float64 = math.Float64frombits(2047 << 52) // 64位正无穷大
2var inf_64_1 float64 = math.Float64frombits(4095 << 52) // 64位负无穷大
3
4var inf_32_0 float32 = math.Float32frombits(255 << 23) // 32位正无穷大
5var inf_32_1 float32 = math.Float32frombits(511 << 23) // 32位负无穷大
Latest Posts