计算机系统基础——数据的机器表示与处理
课程为中国大学MOOC,南京大学计算机系统基础
向下为具体实现,向上为抽象概括
八进制用后缀O表示,十六进制用后缀H或者前缀0x表示
进制转换
R进制数=>十进制数
按权展开(权==>进制)
十进制数=>二进制数,再将二进制数转换为16或8进制
记住2的幂次
1:1
2:10
4:100
8:1000
16:10000
以此类推
理论上使用为短除法,在不记得的时候可以使用
通常不推荐如此使用,建议使用下面的方式进行转换
需要注意,现实生活中地精确值在现实生活中可能无法表示
定点数和浮点数
由于数值中的小数点无法表示,因此需要通过约定的方式来确定小数点的位置
小数点的位置约定在固定位置的成为定点数
小数点位置约定为可浮动的书称为浮点数
定点小数:表示浮点数的尾数部分
定点整数:分带符号的整数和无符号的整数
不管是定点数还是浮点数,都是定点数的编码问题
原码
正号用0表示,负号用1表示,数值部分不变
移码
将每一个数值加上一个偏置常数
使用移码表示指数(阶码)方便比较大小
补码
是一个模运算后的系统
结论1:一个负数的补码等于模减该负数的绝对值
结论2:对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替
结论3:一个负数的补码等于将对应的正数补码各位取反,末尾加一
求真值补码更加简便的方式:从右往左遇到的第一个1的前面各位取反
求补码的真值:
无符号整数
多采用第一种方式进行表示
一般用于表示地址运算,标号表示等等
无符号整数的编码没有符号位
能表示的最大值大于位数相同的带符号整数的最大值
带符号整数
计算机中用MSB(最高有效位)表示数符(0–整数,1–负号)
现代计算机都用补码表示带符号整数
C语言程序中的整数
由于类型不同存在强制类型转换的问题,且比较的时候会用补码进行比较,因此在比较过程中会发生无符号数和有符号数因为编码的不同而导致数值的不同,即原来的数值在比较过程中会发生变化(因为C语言会在同时出现有符号数和无符号数的比较情况下的数值转换成为无符号数进行比较)
比较的时候会用补码进行比较,因此在比较过程中会发生无符号数和有符号数因为编码的不同而导致数值的不同,即原来的数值在比较过程中会发生变化(因为C语言会在同时出现有符号数和无符号数的比较情况下的数值转换成为无符号数进行比较)
需要注意一次,C90和C99标准中存在的差异以及如上述问题存在而导致的一些边界问题