文章目录
目前记录至浮点数
2.1 信息存储
2.1.2 字数据大小
- 虚拟地址的范围:每台计算机的字长即虚拟地址空间的最大大小,对于字长为w位的机器而言,虚拟地址的范围为0-2^w-1
- "32位程序“和”64位程序“:区别在于程序的编译方式而不是运行的机器类型
2.1.3寻址和字节顺序
- 大端法和小端法:
- 大端法:最高有效字节在前(最高有效字节地址最小)
- 小端法:最低有效字节在前(最高有效字节地址最大)
2.1.4 表示字符串
对一个字符串使用上述的show_bytes函数,在使用ascii码的任何系统上都将得到相同结果,与字节顺序与字节大小无关,平台独立性较好。
2.1.7 C语言中的位级运算
- 对任一位向量a,有a ^ a=0
- 位级运算的常用法:生成掩码,例如~0将生成一个所有位全为1的掩码,不论机器的字大小。
2.1.8 C语言中的移位运算
- 左移只有一种,而右移有两种:逻辑右移和算数右移
- 逻辑右移:直接在左端补0,无符号数必须使用逻辑右移。
- 算数右移:如果原来数字左端第一位为1,则填充1,否则填充0,有符号数一般使用算数右移。
- 注意:
- 移位运算符的优先级比四则运算低。
- 应尽量避免对w位的数据类型移动k>=w位(undefined),若移动k位其结果还是原来的数
2.2整数表示
2.2.3补码编码
- 补码编码中将字的最高有效位解释为负权,即
- 注意:
- 补码是不对称的,Tmin没有与之对应的正数。
- 对于位数相同的有符号和无符号数有Umax=2Tmax+1,-1和Umax(最大的无符号数)有同样的位表示。
有符号数和无符号数之间的转换
反过来有
显式类型转换(类型指派)和隐式类型转换(把一种变量赋给另一种变量)都会运用上述规则。
当执行运算时,如果一个运算数有符号而另一个无符号,编译器会隐式将有符号数转换为无符号数。
2.2.6 扩展一个数字的位表示
- 将一个字长较小的数据类型转换为字长较大的:
- 无符号数:零扩展,即直接在前面添加0
- 补码数字:符号扩展,首位是1就补1,否则补0(类似于算数右移)
- 对一个变量同时进行两种转换(如从short到unsigned int)时,先进行大小转换再进行符号转换。
2.2.7 截断数字
- 截断无符号数:
- 截断有符号数:
2.3 整数运算
2.3.1 无符号加法
2.3.2 补码加法
- 检测补码加法中的溢出有两种情况:
- x>0,y>0且x+y<=0
- x<0,y<0且x+y>=0
2.3.4 无符号乘法
2.3.5 补码乘法
检测xy是否溢出:p=xy,return !x || p/x=y;
2.3.7 除以2的幂
- 除以2的幂的无符号除法:直接右移
- 向下舍入的补码除法:直接右移
- 向上舍入的补码除法:做除法x/y之前加上一个偏置量y-1
- 对于使用算术右移的补码机器,c表达式(x<0?x+(1<<k)-1:x)>>k将计算数值x/2^k(向0舍入)
2.4浮点数
2.4.1 二进制小数
- 二进制表示法只能准确表示能够被写成x*2^y的数,其他值只能近似表示。
2.4.2 IEEE浮点表示
IEEE浮点标准用V=(-1)s*m*2E 的形式表示一个数