深入理解计算机系统 第2章 信息的表示和处理

目录

2.3 整数运算

2.3.4 无符号乘法

2.3.5 补码乘法

2.3.7 除以2的幂


2.3 整数运算

2.3.4 无符号乘法

将一个无符号数截断为w位等价于计算该值模2w

2.3.5 补码乘法

C语言中的有符号乘法是通过将2w位的乘积截断为w位来实现。

将一个补码数截断为w位相当于先计算该值模2w,再把无符号数转换为补码,得到

固定大小的补码算数运算的位级操作与其无符号运算等价,即截断w位后的位级表示相同。

2.3.7 除以2的幂

无符号数的右移一定是逻辑右移(为什么???)

写一个函数div16,对于整数参数x返回x/16的值:

int div16(int x)
{
    int bias=(x>>31)&0xF;
    return (x+bias)>>4;
}

bias为偏置量,由于计算机执行向右移位操作时是进行算术右移的,所以,当x<0时,bias的位级表示全为1,此时bias的值为15,当x>0时,bias的位级表示全是0,此时bias的值为0(补码中最高位是符号位,1表示负数,0表示整数)。

设置偏移量的原因是:两个int型的x和y作除法,当x的值为非负数时,x/y的商结果是向下取整的,如20/16在区间[1,2)上,向下取整得1,再如32/16在区间[2,3)上向下取整得2;但是,当x的值为负数时,比如-20/16在区间[-2,-1)上,按照计算机向下取整的原则,-20/16=-2,显然与我们的预期值-20/16=-1不符。为了得到预期值,我们需要增加一个偏移量来修正这个运算结果,我们只需将区间[-2,-1)偏移到区间[-1,0),再向下取整,即可得到预期值。

对于偏置量的取值,正如上面所说,x的值为非负数时,偏置量为0(位级全0);当x为负数时,偏置量为2^n-1(位级全1)。

2.4 浮点数

非负浮点数的一般示例如下图:

习题

练习题2.48  整数3510593的十六进制表示为0x00359141,而单精度浮点数3510593.0的十六进制表示为0x4A564504。推导出这个浮点表示,并解释整数和浮点数表示的位之间的关系。

2.4.4 舍入

四种舍入形式

对于二进制采取向偶数舍入时,一般来说只有形如XX···XX.YY···Y100···的二进制位模式的数,这种舍入方式才有效,其中X和Y表示任意位值。

例如:考虑舍入值到最近的四分之一的问题(二进制小数点右边2位)

10.0001向下舍入到10.00;10.00110向上舍入到10.01;因为这两个值不是两个可能值的正中间值。

10.11100向上舍入成11.00,而10.10100向下舍入成10.10,因为这两个数是两个可能值的中间值,我们倾向于使最低有效位为零。


 

无关问题

int b,c; //假设int是32位的情况
int64_t a=(int64_t)b*c;
b和c是先强制转化为64位精度再计算,还是先进行32位精度计算再强制转换为64位精度?

猜你喜欢

转载自blog.csdn.net/qq_29856169/article/details/86688368