这是我开始学习CSAPP的笔记的第二篇,在接下来的内容,我会分享自己在学习CSAPP时的笔记,感受等等,学习资料来自b站
声明:所有内容基于自己的理解,如有错误感谢大家指出。
链接:【精校中英字幕】2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频_哔哩哔哩_bilibili
一.对位运算的理解
1.&,|,^,~
之前一直仅仅把位运算当做一种普通的操作符,现在看到这之后,发现原来位运算跟集合的操作是有联系的,逻辑与相当于2个集合交集,逻辑或相当于2个集合并集,逻辑非则是取补集,而异或运算则是取2个集合的差集的并集。
2.位移运算
左移n位:将低位左移n位,高位将会被覆盖,低位补0.
如: 01001110 左移4位 -> 11100000
右移
逻辑右移: 右移n位,高位补0
算术右移: 右移n位,高位补符号位数字(最左边的一位是0就补0是1就补1)
x = 01001000
x << 8 //这里相当于 x << 8mod8 = x << 0,所以x没有改变
这里视频中提到一个x << 8你会得到什么,弹幕有的说翻译错了有的说没错。然后我自己用c试了一下,x << 8之后你得到的还是x本身,我理解的是因为x的数据类型是由8位表示的,所以你左移n位其实就等于你左移n%8位,所以x<<8 = x << 0那不移动不就是本身咯,虽然很奇怪,但计算机就是这么计算的,理解成一种优化把。
一.无符号二进制和补码转十进制
公式挺简单的,就是学校里教的求和公式。
注意一下有符号的第一位求和的时候要加负号
举例:同样对于 11111
无符号: 16 + 8 + 4 + 2 + 1 =31
补码: -16 + 8 + 4 + 2 + 1 = -1
然后有几个概念,Umax,Umin,TMax,TMin,见下图
三.c中数值的比较
总结一下就是如果2个数类型不同(一个是无符号,一个是有符号(补码)),就需要转化成无符号的进行比较,补码转无符号的方法就是如果补码符号位为正,那么相等。如果为负数,那么加上2的n次幂,n是数据类型的用的多少位来表示。
四.一个小思考题
//下面是一个计算绝对值的函数,思考输入TMin会返回什么
if(x >0)
return x
else
return -x
因为我们知道|TMax| = |TMin| - 1,所以我们似乎没办法表示TMin的绝对值,所以输出结果肯定不是|TMin|。
答案是TMin,因为计算机计算一个数的负数,是通过 -x = ~x + 1实现的,这个等式的原理是:
举个例子,一个4位的数据类型,那么无论哪个数x,x + ~x = 1111 = -1 所以 x + ~x + 1 = 0,所以
- x = 0 - x = ~x + 1。
上面的内容是看视频过程中做的笔记,看完之后是有点懵的,等我去看看书再回来继续写。
多少位的机器是指程序最多访问多大的虚拟地址空间,如32位机器可以访问2的32次方的字节。
五.大端法与小端法
我们都知道,一个数据类型一般在计算机中是连续存放的,比如一个int类型的首地址是0x100,那么他会占用从0x100开始的四个字节,0x101,0x102,0x103.假设你这个int类型的数字的值的十六进制表示是0x
大端法小端法其实就是存储的顺序不同,见图.
但是对于字符不会有影响,因为字符就占一个字节,所以大端法小端法都一样。因此文本类型的数据比二进制数据更具有平台无关性。
六.补码
相信很多人跟我一样对补码的理解还停留在,反码加1。。。。。
看了CSAPP我才知道补码原来是计算机中对有符号数的一种表示。
7.无符号数与有符号数的互转
c语言是支持类型强制转化的,而强制转换其实就是改变了二进制表示的解释方式.
总结
这一节课的视频主要就介绍了数据类型在计算机中是如何表示的,以及一些基本运算,及这些运算可能出现的问题。