进位计数制:用一串数字表示一个
数
,每个数字的位置对应一
个
权重
,该数的值就等于所有数字按权展开后相加的和。
某一数制下的数据:
最高有效数字:most significant digit(MSD)
最低有效数字:least significant digit(LSD)
二进制数中,最左边的位称为最高有效位MSB,最右边的位称为最低有效位LSB
度量单位:bit,Byte,KB,MB,GB,TB,PB
进位计数制:
八进制数,取0~7,逢8进1,后缀“O”表示八进制数。
十六进制数,取0~9,A~F。常用前缀“0x”或后缀"H"表示十六进制数。
二进制对应字母B,十进制对应D
进位数制之间的相互转换:
二进制转八进制、十六进制:分组对应法,按照小数点为分界线,前、后按照器对应的二进制转换位数进行处理。
A进制转B进制:
整数部分:除以基数取余数,写到最后一个小于基数的数后,把余数倒着写一遍,第一个余数对应的是MSB,而最后一个余数对应的是LSB。
小数部分:乘以基数取整数,取了整数后,将小数部分剩余的数据保留,重复进行数值转换的操作。即,继续反复乘以基数,然后记录整数部分。当小数部分为0或者达到最大有效数字后,就停止算法。且将刚刚得到的整数部分按照得到的先后顺序正序排列,就得到小数部分的数位表示。
当然,有的时候小数的转换是存在误差的。对于一些数,无论怎么乘基数都是由无限不循环小数,这个时候先根据精度预处理出需要进行基数乘法的次数,然后到达次数之后再终止计算即可。
数值型数据的编码表示:
什么是定点数? - 知乎
数值数据表示的三要素:进位计数制、编码格式、定浮点表示
有四类定点数的编码,可以解决正负号的问题:原码、反码、补码、移码
定点整数,有无符号/有符号整数
定/浮点表示,解决小数点问题,需要考虑定点整数和定点小数
浮点数:可用一个定点小数(尾数)和一个定点整数(阶码)来进行浮点数的表示。
原码:
一个数是由符号位和数值位两部分构成的。最高位代表一个符号位,正数符号位为0,负数符号位为1.
特点:
(1)负整数与正整数的个数相同,唯一区别在于符号位。2^(n-1) -1个正负数。
(2)0的表示并不唯一,有两种表示形式,不利于程序员编程。有1+0000,或0+0000
(3)需额外对符号位运算进行处理,不利于硬件设计。
(4)难以实现出现负数的运算。
在浮点数表示标准中,浮点数的尾数用原码表示。
补码:
模运算系统中的数值表示。若一个数x是负数,那么其在模系统下的补码为:x + mod。
对于正数,其补码就是原码。而对于负数,其补码为:用全1的二进制数,减去负数的绝对值部分。也就是:2^n - 1 - 负数的绝对值。等价于11111... - 负数的绝对值。即对负数的绝对值部分取反,然后再+1。
结论1:一个负数的补码等于模减该负数的绝对值。
结论2:对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。
在补码所在的模运算系统中,减法也可以用加法实现。如-3-3 = -3 + (-3),这样实现了加减法运算的统一。
结论3:n位数B的补码为2^n - B。若B范围为1~2^n - 1,则2^n - B的范围也是1~2^n-1。若B=0,则补码为2^n,共n+1为,最高位舍弃,还是0.
补码的计算:2^n - B = 2^n - 1 - B +1 相当于把B的每一位取反后再加1 无需减法运算
补码的最高位MSB用作
符号位
,等于
1时表示负数
,且其权重
为
-2
n-1
,n-1位
数值位
。
因此,补码表示下的最小的负数为10000....只有最高符号位为1,代表是-2^(n-1),若下面绝对真值部分有数,则需要加上一部分数据,会使负数的绝对值变小。
补码表示范围为:-2^(n-1)~2^(n-1)-1。因为正数部分需要多表示一个0,则负数最终的表示数目要多一个。
正数的补码:符号位0+数值位。负数的补码:符号位1+数值位按位取反后+1
结论4:一个数连续求两次补,最后得到的是它自己。
大多数计算机和数字系统采用补码来表示数值。
举例:求-123在8位二进制数下的补码:
-123是负数,先求其原码:11111011。然后,最高位符号位1保留,接着对负数绝对值部分求反后加一。10000100 + 1 = 1000101。
求特殊数的补码,假定机器数有n位。
[-2^(n-1)] = 1000....0
[-1] = 111....1
[+0] = [-0] = 2^n - 0 = 2^n 一共有n+1位数,最高位将被舍弃。所以还是0000....0
其实,上述过程中,已经计算了反码。n位数B的反码就是,从2^n - 1中减去B。可以通过对B的每个数位逐位取反来实现。正数的反码由符号位0+数值位表示。负数的反码由符号位1+数值位逐位取反表示。
反码具有对称性,0由两种不同的表示形式。0000...0和100...00,反码可表示的数据范围是:-(2^(n-1)-1)~2^(n-1)-1
余码、移码、偏置码
直接在原有的编码中加上偏置值B来表示,即X+B,这种编码方法称为余码、移码、偏置码。
余B码表示范围由[-2^(n-1),2^(n-1)-1]变为[-2^(n-1)+B,2^(n-1)+B-1]
一般来说,编码位数为n的时候,偏置数取2^(n-1)
余3码,是一种自反码。每位取反可得到反码。
为什么用补码表示带符号整数?
(1)补码运算系统是模运算系统,
加、减运算统一
,
符号位直接参与运算
。
(2)数
0的表示唯一
,方便使用
(3)比原码和反码
多表示一个最小负数
(4)与移码相比,其符号位和真值的符号对应关系清楚
一般在全部是正数运算且不出现负值结果的场合下,可使用
无
符号数表示
。例如,地址运算,编号表示,等等。
无符号数的编码中
没有符号位
。
能表示的最大值
大于
位数相同的带符号整数的最大值(Why?)
例如,8位无符号整数最大是255(1111 1111)
而8位带符号整数最大为127(0111 1111)
总是整数,所以很多时候就
简称为“无符号数”
。
若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无
符号数
浮点数的表示:
什么是浮点数? - 知乎
浮点数的规范表示中,M(Mantissa)被称为浮点数的 尾数 ,R(Radix)被称为阶码的 基数 ,E(Exponent)被称为阶的 阶码 。
IEEE754浮点标准形式V=(–1)
s
x
M
x
2
E
符号位S
(Sign):表示数的正负,正数(s=0),负数(s=1) 。
尾数M
(significand):是一个二进制小数,范围在[
1.0
,
2.0
)(前提是规范化的前提,若阶码为全0或全1,则尾数是0~1之间的数据)
阶码E
(exponent):表示浮点数的权重,权重是2的E次幂。本来可以表征负的幂次,加上偏置值2^(k-1)-1之后就能够得到无符号范围下的阶码。
阶码编码exp:规定阶码为
无符号数
,既不全0又不全1。阶码
全0或全1为
非规格化浮点数
。
◼
阶码编码exp:表示为阶码E的偏置(biased)形式, exp =E+
Bias,称为余码或偏置码,使得数值大于0。
exp:无符号数
偏置Bias=2^(
k-1)
-1,
k为阶码的位宽
单精度:127 (Exp: 1…254, E: -126…127)
双精度: 1023 (Exp: 1…2046, E: -1022…1023)
◼
小数字段frac表示尾数M的编码M=
1
.xxx…x
2
xxx…x: 小数字段数值
最小值:000…0 (M = 1.0)
最大值:111…1 (M = 2.0 – ε)
浮点数表示的非规格化情况:
一、阶码编码
exp
等于全
0
,
表示数值非常小。
阶码编码exp:
E =1 – Bias
小数字段
frac
表示尾数
M
的编码
M=
0
.xxx…x2
(尾数最高位隐含为0 ,
非规格化小数字段M小于1)
xxx…x: bits of frac
Exp= 000…0,frac= 000…0
◆
表示数值为0
◆
有正负0区分
Exp= 000…0,frac ≠ 000…0
◆
数值非常接近于0
注:阶码全0的情况,则不为规格化情况,那么尾数前面的隐藏位就消失了。
二、阶码编码exp
等于全1
Exp= 111…1,
frac= 000…0
◆
表示数值为
◆
当两个非常大的数相乘或
除数为0
时,表示数据溢出
◆
1.0/0.0 = −1.0/−0.0 = +
, 1.0/−0.0 = −
◆
5+(+∞) = +∞
Exp= 111…11,
frac ≠ 000…0
◆
表示NaN,非数(Not a Number)
◆
一些运算结果不能是实数或无穷,就会返回该值
◆
例如: sqrt(–1),
−
,
0,
0/0,∞/∞
注:阶码全1,尾数部分1全0,则表示数值正无穷。尾数全0,则非数(/0,%0,sqrt(-1))
偏移量:本身与阶码的位数是相关的。假设预留出n位来存储阶码,那么阶码本身是无符号整数,则需要加上一个偏移量K = 2^(n -1)-1,这样就能表示出负的指数来。如n = 8时,阶码可以表示0~255范围内的数;需要加上偏移量K = 2^7 - 1 = 128 - 1 = 127。这样就可以实现负数的表示了。所以,这个偏移量应当阶码表示范围的中间量。比如初始的指数E= - 120,那么加上偏移量2^7-1 = 127之后,E+B = 7,可以用一个无符号数进行表示了。所以,偏移量的效果就再此,使得指数为负的情况下,能够转移成无符号整数存储阶码。
(类比桶排序的时候,存在输入数据为负的情况,此时加一个偏移量就能使数组下标保持合法了)
隐藏位:由于尾数M的最高位总是1,所以为了扩大尾数的位宽提高精度,可以将尾数的最高位隐藏起来。这样单精度 23 位尾数可以表示了 24 位有效数字,双精度 52 位尾数可以表示 53 位有效数字
值得注意的是,在位宽一定的前提下。若阶码的位宽增大,在符号位不变的情况下,势必会造成尾数的位宽减少。也就是浮点数表示的范围增大,而精度降低;同时,若尾数的位宽增大,则阶码的位宽减小,浮点数表示的精度增大,而表示的范围减小。所以,不论阶码定义成了无符号整数,还是尾数的隐藏位设置,其根本目的是在提高精度、扩大浮点数的表示范围。
在浮点数的运算过程中,为了使浮点数的表示具有唯一性,需要进行规格化操作:
面试问题:二进制数10110001的值是多少? 不要不知道,下一步问:无符号数、二进制原码、补码、反码、八位浮点数表示。
十进制数的二进制编码表示
二进制数可以用来表示10个十进制数码。
至少需要四位编码,有很多种不同方法。可分为有权码和无权码;其中最自然的编码是8421BCD码。以四位2进制数0000~1001表示0~9这10个数码。
有权码,权重值分别是2的幂次;
余三码:相加等于模系统的,互为反码,称为自反性。
问题:2421BCD码,5的表示1011,这两个1的使用是否有区别?为什么不能用0101呢?
非数值型数据的编码表示
数据非数值数据的表示:逻辑数据、西文字符、汉字;动作和状态编码;
数据的宽度;
数据的存储排列:大端、小端方式。
逻辑数据的编码表示
用1位表示,如1真0假。N位二进制数可以表示N个逻辑数据,或一个位串。
位串
西文字符的编码表示
用ASCII(American Standard Code for Information Interchange)
需要记忆一下大写字符、十进制数对应的ASCII码。常见的ASCII码。
汉明码_百度百科
两个码元对应位不同的个数,就叫做汉明码之间的距离。