csapp 课堂小结 计算机存储数据,数据表示

这节课老师讲的比较多而且知识点也比较散,得好好整理一下梳理一下

1、语法有没有问题和有没有漏洞是两回事,编程的时候应该注意计算机的底层如何实现你的逻辑,要做到每一步都要在你的掌控范围之内。

2、漏洞经常由于一些变量的算术运算造成
3、电容来存储1、0
4、int x 声明一个变量,它的数据在机器内部连续的存储的
5、long在平台移植性上有关系,因为别的变量在不同的机器上被分配的字节数目是一样的,但是long的话会根据你系统而作出不一样的选择,不一样的选择就会影响到你程序的平台移植性。
6、typical 32-bit 寄存器就是32位 %eax.....寄存器(32位字长)
     什么引脚都是32根

    数据总线、内部寄存器、地址总线(32):跑的是地址信息(内存max 2的32次方个字节)--虚拟地址空间大小,指针大小,long型大小

    在这里比较有趣的一个点是,我们如果地址总线为32位,那么我们可以访问多少个内存的地址单元呢?答案是2的32次方,那还是挺大的。64位机器就足足翻了一翻。

9、外存通过(操作系统,编译器)把数据存放到内存(代码段,数据段),动态调用,也就是说,你一个程序在不同的机器,甚至在同一个机器,不同的时间运行,分配得到的资源在某种程度上是不一样的。
10、字符串存储在计算机中是没有大端和小端的区别的,因为字符串被机器理解为数组,一个个元素存储,哪里有所谓的大端和小端的区别呢?
11、布尔代数融入到了计算机底层里。
12、c支持 & | ~ ^,在这里一点哈哈^这个运算是异或运算,而且这里都是按位操作的哟
13、 逻辑运算 &&、||、! (!!=两个!),这里就是按照整个数字来处理的而不是按位操作啦!
14、移位操作其实是*2或者/2(移位操作有可能造成漏洞),因为我们时候移位太多并不会被报错,但是这样子的结果显然不是我们想得到的结果。
15、不声明无符号,都会进行算术移位!
16、可以移很多位但是结果不是想要的,就像14点所提到的一样。

17、负数,符号位不参与反码。这句话是我总结的,就像我们的-7,在八位上存储,那就是

1111 1000+1=1111 1001

可以验证一下,-128+64+32+16+8+1=-7

这个是怎么得到的呢,首先最高位的符号位为1,确定了

1xxx xxxx

然后根据原码表示7

1(000 0111)

对源码部分反码加1

1111,1001即可得到正确的结果。

在这里我甚至会有一种自己的理解,为什么我们求补码的时候,是按位取反+1呢

我们可以想一下,我们,因为我们机器理解数据的特殊定义,符号位的值是-的2的存储位数-1次方,记为-v

负的挺多的对吧哈哈

但我们比如现在要表示-7,是不是想要加一些数来让负的没那么多?

根据我们的理解,即使把剩下的全部位都为1,那么我们这个sum和-v的绝对值还是差了个1

于是我们加了个1,这样子,我们sum和-v的绝对值就相等了。sum-v=0,这是一个极好的状态,现在我们想表示什么,就少加对应的值,即可表示负的这个数。

-7如何表示,那么其实就是“加的没那么多,加的少7”,所以我们之前把剩下的全部位都为1,改为,除了最低位的111变为0(表示+4+2+1=+7)

把上面的思想整理一下,那么就是

除了符号位为1

其余的位置表示为

要表示的负数的绝对值

的原码

的反码

+1

(我自己想的中间“0状态”理解法hh也不知道正确不正确。)

18、补码的优点为,可以让0只有一种表达,而且可以让减法变为加法

        想一下,补码的0只可能是0000 0000(八位为例),没有正0和负0之说。

19、补码表示范围不对称(bug源头)

       取负,求绝对值操作有可能有致命安全漏洞 [+127,-128 ]

20、机器并不知道你怎么存储的,但是知道怎么读

21、补码中|min|=max+1,这个要这样子想哈哈,利用进位的思想,八位为例

1000 0000表示最小的值-128

0111 1111表示最大的数127

从绝对值的理解上,1000 0000=0111 1111+0000 0001

这样子不知道会不会好理解一些呢哈哈



你可能感兴趣的:(计算机系统,补码,计算机系统,csapp,数据)