PC逆向.进制

数据以补码形式存储,如何解释取决于使用者(正数?负数?)
正整数的原码、反码、补码都是相同的等于其原码等于其绝对值
原码、反码、补码是编码规则,求反、求补是运算方式
原码:最高位存储符号,剩余位存储数据。符号位正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
posted @ 2020-03-16 19:03  N.everever  阅读(268)  评论(0)    收藏  举报