数据以补码形式存储,如何解释取决于使用者(正数?负数?)
正整数的原码、反码、补码都是相同的等于其原码等于其绝对值
原码、反码、补码是编码规则,求反、求补是运算方式
原码:最高位存储符号,剩余位存储数据。符号位正0负1,数据位等于其绝对值
例:正数原码 52 00110100
负数原码 -52 10110100
反码:最高位存储符号,剩余位存储数据。符号位正0负1,正整数反码等于其原码,负整数反码等于其绝对值取反
例:正数反码 52 00110100
负数反码 -52 11001011
补码:最高位存储符号,剩余位存储数据。符号位正0负1,正整数补码等于其原码,负整数补码等于其绝对值取反再加1即求补
例:正数补码 52 00110100
负数补码 -52 11001100
求反:二进制取反
求补:求反,加1
常用进制
2 0~1,逢2进1
8 0~7,逢8进1
10 0~9,逢10进1
16 0~9Aa~Zz,逢16进1
N 由N个符号(约定的可随机定义)组成,逢N进1
进制转换目的是便于阅读
2/8/16/n => 10 :
10101(2) = 1 * 24 + 0 * 23 + 1 * 22 + 0 * 21 + 1 * 20 = 21
12345(8) = 1 * 84 + 2 * 83 + 3 * 82 + 4 * 81 + 5 * 80 = 5349
abcdf(16) = a * 164 + b * 163 + c * 162 + d * 161 + e * n0 = 703711
xyzij(n) = x * n4 + y * n3 + x * n2 + i * n1 + j * n0 =
10 => 2/8/16/n :整数部分除 n 取余,直到商为 0 ,逆序(余数倒过来);小数部分乘 n 取整,直到乘积为 0,乘不尽时按精度取约数,顺序
12345(2) = 11000000111001
12345(8) = 30071
12345(10) = 3039
进制转换本质在于查表
2<=>10 :2^?
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8
128 64 32 16 8 4 2 1 0.5 0.125 0.25 0.0625 0.03125 0.015625 0.0078125 0.00390625
123(10) = 64 + 32 + 16 + 8 + 2 + 1 = 1111011(2)
1010101(2) = 64 + 16 + 4 + 1 = 85
19.25(10) = 16 + 2 + 1 + 0.25 = 10011.01(2)
浮点数存储
s符号位,exp指数位,frac数据位
规格化浮点数:是指把一个浮点数按指定的格式进行转换。比如前述浮点数存储,其整数部分恒 1
非规格化浮点数:当发现整数部分恒 1 将会使得指数部分无法有效表示时,会出现0.00...1...*2x 的形式
特殊浮点数:
无穷 exp=111...1 frac=000...0 有正负之分 1.1/0.0=+∞ -1.1/0.0=-∞
计算机无法表达的数 exp=111...1 frac≠000...0 ,比如 sqrt(-1) 、 ∞-∞ 、 ∞*0
浮点数的0有+0和-0之分
规格化浮点数存储32bit单精度
符号位1:正0,负1
指数位8,范围-128~127,约定指数为正则等于127+指数真值,指数为负则127-指数真值
数据位23,二进制的科学记数法小数点前必为1,所以数据位存的是小数点后的值。
示例一:1234.625(10) = 0100 1101 0010.101(2) =1.0011010010101* 10^10
符号位1:0
指数位8:127 + 10 = 137 = 128 + 9 = 1000 1001(2)
数据位23:弃小数点前那个恒1并在右端以0补全位数00110100101010000000000
组合得之,0 10001001 00110100101010000000000 => 44 9A 54 00 =>小端存储00 54 9A 44
示例二:-0.625F(10)0.625F(10)= 0.101(2) = 1.01* 10^(-1)
符号位1:1
指数位8:127 – 1 = 126 = 01111110(2)
数据位23:弃小数点前那个恒1并在右端以0补全位数01000000000000
组合得之,1 01111110 01000000000000000000000 => BF 20 00 00 =>小端存储00 00 20 BF
规格化浮点数存储64bit双精度
符号位1,正0,负1
指数位11,范围-1024~1023,约定指数为正则等于1023+指数真值,指数为负则1023-指数真值
数据位52,二进制的科学记数法小数点前必为1,所以数据位存的是小数点后的值。
示例一:1234.625(10) = 0100 1101 0010.101(2) =1.0011010010101* 10^10
符号位1:0
指数位11:1023 + 10 = 1033 = 10000001001
数据位52:弃小数点前那个恒1并在右端以0补全位数00110100101010000000000..0
组合得之,0 10000001001 00110100101010000000000000000000000000000000000000004093 4A 80 00 00 00 00 00 =>小端存储00 00 00 00 00 80 4A 93 40
示例二:-0.625F(10)0.625F(10)= 0.101(2) = 1.01* 10^(-1)
符号位1:1指数位11:1023 – 1 = 1022 = 01111111110
数据位52:弃小数点前那个恒1并在右端以0补全位数010000000000.00
组合得之,1 01111111110 0100000000000000000000000000000000000000000000000000BFE4 00 00 00 00 00 00 =>小端存储00 00 00 00 00 00 00 E4 BF