目录
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位精度?