CSAPP:整数表示

 

1. 位编码整数有两种方式:一种只能表示非负数,另一种可以表示负数,零,正数。

2. 在表示有符号整数时,负数的可表示范围比正数的范围大于1。这是由于在用位表示时,最高位作为符号位,1表示负数,0表示正数,可表示的负数最小值为,w位的话为-2^(w-1),

 符号位为0时可表示的范围为0~2^w - 1,这里面多了一个0,所以不对称。

3. C与C++都支持有符号和无符号数,JAVA只支持有符号数。

4. 函数的双射是指输入和输出的结果是一致的。

5. 有符号数与无符号数之间的相互转换,将负数转换成无符号数可能得到0,0的补码表示为(8位)0xFF,0XFF对应其无符号数的最大值为255。

6. 补码转为无符号数,负数时需要加上2^w,非负数不变。

7. C语言中一个有符号数与无符号数相加,会隐式的将有符号数转为无符号数,比如-1 < 0 = 1,而 -1 < 0U = 0。

8. 语言中的最小值表示方式为#define INT_MIN -INT_MAX-1

9. 零扩展,将无符号数转为更大数据类型,简单的在头部填0。

10. 补码的扩展,在开头填充符号位。

11.无符号数 数字的截断:结果为 对x取无符号数 x mod 2^k。

12. 补码的截断:对x取无符号数 x mod 2^k 取补码。

13. 无符号数加法溢出时,x+y > 2^w 结果为x + y - 2^w。溢出判断: s = (x+y)mod 2^w s < x时溢出。

14. 补码加法的溢出有两种,一种是正溢出,一种是负溢出。溢出检测:x>0 y>0 s <= 0时正溢出 x < 0 , y < 0 ,s >= 0时正溢出。

15. 补码的非里,TMin的非为本身,这是由于对于w位,Tmin = 2^(w-1) Tmin + Tmin = 2^w发生加法溢出需要减去2^w 结果为0, 因此,为其本身。

16. 乘以常数: 乘法需要10多个时钟周期。除法需要30多个周期,优化形式分为两种A: (x<<n) + (x << (n - 1)) + ... + (x << m) B: ( x<<(n + 1)) - (x << m);

17. 无符号数的除法结果为逻辑右移动加一个向0 舍入。补码除法是算术右移加一个向下舍入。

posted @ 2023-02-05 14:27  fourmii  阅读(48)  评论(0编辑  收藏  举报