CSAPP

CSAPP

2021/1/28
(这是我给自己写的,方便自己以后回顾,所以会啰嗦,并且写的也不细致)

书本推荐:

  1. The C Programming Language, Second Edition, Prentice Hall, 1988

X^2 ? 0
当x是float的时候是正确的,但是当x是int的时候可能是不对的
我自己的理解:计算机里的浮点数是IEEE形式表示的,有一个专门的符号位表示正负,就算x过分的大也不会影响到符号位,最多就是正无穷大或者是负无穷大。 而是int的类型的时候如果x过分的大就会发生结果装不下,就会溢出,就有可能是负的。(计算机里一般都是用补码表示的,这里理解要先看后面那个补码的内容)

更好的方法理解Operations
位运算

  1. & Intersection
  2. | Union
  3. ^ Symmetric difference
  4. ~ 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) √ 因为这里只改变了符号位

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值