目录
一.数制和编码
1.进制
十进制到二进制,八进制,十六进制都是一样的算法,只是除数换成了基数:
小数换算二进制,八进制,十六进制也类似,只是乘的数变成了对应的基数:
二进制转换成八进制:每三位等值一位八进制位
二进制转换十六进制:每四位等值一位十六进制位
2. 定点与浮点数的表示
任意一个二进制数可以表示为:
浮点数的表示范围比定点数要大得多,(通常用0表示正号,1表示负号)
3.机器数(原,反,补,移)
什么是真值,真值就是现实中那个带符号的数就叫真值
机器数一定是0/1序列,通常用十六进制表示
原码:正负数编码仅符号位不同,0的表示方式有两种000...0和100...0,与真值对应关系更直观, 转换更加方便,现代计算机不用原码来表示整数,只用定点原码小数来表示浮点数的尾数 部分
补码:真值为正,及符号位为0,则数值部分不变 ;真值为负,符号位为1,数值部分各位取反, 末位加一;已知X的补码,则各位取反,末位加一求-X的补码
溢出:两个n位二进制数在进行运算过程中可能会产生超过n位的数,如果低n位数不能正确表示 运算结果,及丢掉的那部分是运算结果的一部分,就称之为溢出
反码:负数的反码就是各位取反,不加一
移码:浮点数的指数都是用移码来表示,移码和补码的区别只有符号位相反
二,整数
1.无符号整数
无符号整数就是正整数或非负整数(0)
优点:无符号整数省略了符号位,因此正数的表示范围比带符号整数的表示范围更大,eg:八位无符号整数最大数255,而带符号的仅有127
2.带符号整数
现代计算机中带符号整数都用补码表示
补码的优势:
- 与原码和反码相比,补码的数0表示形式唯一
- 与原码移码相比,补码运算系统是一种模运算系统,可用加法实现减法运算
- 补码比原码和反码多一个最小负数
- 与反码相比,补码不需要用循环进位来调整结果
3.C语言中的整数类型
数后面加u或U则表示无符号数
C语言中,执行运算时,同时具有无符号数和带符号数参加,则带符号数将被强制转换成无符号数
第一条和最后一条举例说明:
三.实数的表示
1.浮点数的表示格式
直接用例题来说吧:
1.IBM 370 短浮点数格式:0位为数符S,1~7位表阶码(偏置常数为64)8~31位六位十六进制原码小数表示的尾数M,基数为16,阶码变化1等于尾数移动4位,将十进制65794转化为IBM 370的32位短浮点数格式:
只要尾数为0,指数为任意值都为0,称为机器零,因此机器零不唯一;通常用阶码和尾数同时为0来唯一表示机器零,机器零有+0和-0之分
2.浮点数的规格化
对浮点数的尾数进行规格化,除了能得到尽量多的有效数位以外,还可以使浮点数的表示具有唯一性;
若浮点数的基数为2,则浮点数形式应为+-0.1bbbb....bb*2^E(b为0或1);
还有一个点就是左规和右规。
3. IEEE 754 浮点数标准
IEEE 754提供了两种基本浮点格式:32位单精度和64位双精度(基数隐含为2;尾数用原码表示;省略尾数中第一位的1,及隐藏位,偏执常数分别为127和1023)、
好处:尾数可表示的尾数多一位,因而使浮点数的精度更高//指数的可表示范围更大,因而使浮点数范围更大
- 全0阶码全0尾数:+0/-0;0的符号取决于s,一般等效
- 全0阶码和非0尾数:非规格化数;非规格化数的隐藏位为0,单精度和双精度浮点数指数分别为-126或-1022;可用于处理阶码下下溢,使出现比最小规格化数还小的数时程序也能继续进行下去
3.全1阶码全0尾数:正无穷/负无穷
- 产生不发信号的非数:NaN
- 产生明确的结果
4.全1阶码非0尾数:NaN
引入NaN的目的是为了检测非初始化值的使用,当最高有效位为1时,为不发信号(静止的)NaN
当最高有效位为0时,为发信号(通知的)NaN
5.阶码非全0且全非1:规格化非0数
浅做个题吧
求 IEEE 754 单精度浮点数 C0A00000H的值是多少?
4.C语言中的浮点数类型
- 从int转换成float时,不会发生溢出,但可能有数据被舍入
- int或float转换成double时,double有效位更多,故能被精确保留
- 从double转换成float时,float表示范围更小,可能发生溢出,此外,有效数位变少,可能发生舍入
- 从float或double转换成int时,可能会发生截断
四.逻辑值
逻辑数据只能参与逻辑逻辑运算,并且是按位进行的 ,如按位与,按位或,逻辑左(右)移
逻辑数据和数值数据都是一串0/1序列,逻辑运算指令处理的是逻辑数据,算数运算指令处理的是数值数据
(还剩下数据的宽度的宽度与储存与数据校验码,放到明天再来补充)