CSAPP
2021/1/28
(这是我给自己写的,方便自己以后回顾,所以会啰嗦,并且写的也不细致)
书本推荐:
- The C Programming Language, Second Edition, Prentice Hall, 1988
X^2 ? 0
当x是float的时候是正确的,但是当x是int的时候可能是不对的
我自己的理解:计算机里的浮点数是IEEE形式表示的,有一个专门的符号位表示正负,就算x过分的大也不会影响到符号位,最多就是正无穷大或者是负无穷大。 而是int的类型的时候如果x过分的大就会发生结果装不下,就会溢出,就有可能是负的。(计算机里一般都是用补码表示的,这里理解要先看后面那个补码的内容)
更好的方法理解Operations
位运算
- & Intersection
- | Union
- ^ Symmetric difference
- ~ Complement
逻辑运算——得到的结果是true 或者false
shift operation
我突然知道原来我一直以来对左移的理解都有问题,正确的对左移的理解应该是:(number的位数%x )这个式子的结果就是真正左移的位数,也就是说,当我对32位的int进行左移32位的时候,所得的结果还是number本身,不变
注意这里对符号位的理解与yqf上课讲的不一样,二进制数转化为十进制数可以 直接算,前面那个符号位就代表直接把那个数取负就行,例如:(对一个字长位5的计算机而言)10110 --> -16+4+2=-10
根据上面那张图的理解,可以很好的理解这里的公式是怎么来的 当所有的位上都是1的时候得到的结果就是-1(-16+8+4+2+1)
位截断---->取模
位扩展—>符号扩展
让我们假设这里 1010 = -8+2 扩展1位就是11010 = -16+8+2 单单看前面的两个1 这个的效果与-8是一样的
负溢出---->两个负数相加得到一个正数的答案
正溢出----->连个正数相加得到一个负数的答案
假如有个字长为四位数的计算机,最前面的那个数是符号位,如果两个数相加得到的结果超过四位,假设结果是11110=-16+8+4+2=-2 但是由于字长是4位的就导致截断,得到的答案是1110=-8+4+2=-2,虽然这个答案得到的结果和我们想要得到的结果是一样的,但是负溢出和正溢出就是这种情况产生的。
乘法和除法:除法的时候需要先加上一个偏移量,在右移
大小端:小端就是低有效位放在前面,大端就是高有效位放在前面
浮点数:
里的特殊的形式:
- 指数部分和小数部分全0的时候表示0
- 指数全1 小数全0 表示正/负的无穷大
- 指数全1 小数不为0的时候表示非数字NAN
当进行浮点数的乘除法的时候,有时候需要进行舍入(四舍六入五成双)
对于二进制的舍入也是一样的
浮点数不满足结合律
float f f==-(-f) √ 因为这里只改变了符号位