欢迎来到小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(一);本文与第一章不同,因原书书写篇幅从第二章开始就变得很大,所以小护士决定先介绍第二章的基本内容,然后进入本文的主要笔记内容:2.1信息存储。
小护士先列出第二章目录,再讲讲如何做好从入门到放弃的心理准备。
第2章 信息的表示和处理
2.1 信息
2.1.1 十六进制表示法
2.1.2 字数据大小
2.1.3 寻址和字节顺序
2.1.4 表示字符串
2.1.5 表示代码
2.1.6 布尔代数简介
2.1.7 C语言中的位级运算
2.1.8 C语言中的逻辑运算
2.1.9 C语言中的位移运算
2.2 整数表示
2.2.1 整型数据类型
2.2.2 无符号数的编码
2.2.3 补码编码
2.2.4 有符号数和无符号数之间的转换
2.2.5 C语言中的有符号数与无符号数
2.2.6 扩展一个数字的位表示
2.2.7 截断数字
2.2.8 关于有符号数与无符号数的建议
2.3 整数运算
2.3.1 无符号加法
2.3.2 补码加法
2.3.3 补码的非
2.3.4 无符号乘法
2.3.5 补码乘法
2.3.6 乘以常数
2.3.7 除以2的幂
2.3.8 关于整数运算的最后思考
2.4 浮点数
2.4.1 二进制小数
2.4.2 IEEE浮点表示
2.4.3 数字示例
2.4.4 舍入
2.4.5 浮点运算
2.4.6 C语言中的浮点数
2.5 小结
第二章几乎通篇都是重点,无一例外;其中,从2.2整数表示开始就出现很多数学原理和推理;稍微不留神都会被某些地方卡半个小时。但是,如果你之前就具备良好的编程基础以及布尔代数基础,第二章绝对难不倒你。反之,你会直接进入最后一关:放弃。
好吧,基本内容介绍完了,下面进入本文主题。
为什么骨灰级的计算机高手喜欢用十六进制表示数值?因为十六进制恰好可以直接翻译为二进制数据,反之亦然。怎么做?
下面小护士把原书的表格稍微优化一下表示出来,大家就明白了。
十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
十六进制 | 0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 |
二进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十进制 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|
十六进制 | 0x08 | 0x09 | 0x0A | 0x0B | 0x0C | 0x0D | 0x0E | 0x0F |
二进制 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
注意,0x00实际上代表八位都为零的比特[0000 0000]。
十六进制转二进制其实很简单,一个位的十六进制对应二进制的四个位:
0x3C
则为
0011 1100
因此,如果二进制转十六进制也可以用同样的规律可得:
10100101
拆分可得
1010 0101
转换可得
0xA5
是不是很有趣咧。:)
计算机里面有这么一个东西叫字长(word size)。啥意思?它就是代表计算机一次处理数据的长度(设长度为N,则字长为N个比特),或官方地来讲就是指明指针数据的标称大小(nominal size)。这里还讲到了虚拟地址,因为计算机以一个字来编码地址的,所以,现实世界中,32位系统可以访问的虚拟地址空间为4GB,而64位系统则可以访问的虚拟地址空间为16EB。小结一下,对于一个字长为N位的计算机来说,虚拟地址的范围为 0 0 ~ 2n−1 2 n − 1 。
大胆猜测一下,如果物理内存有16EB这么大,恰好充分利用64位系统访问虚拟地址的范围,此时对于MySQL来说,基本没B+树什么事了。
有没有听说过大端法和小端法。(没听说过)
它们俩都是存储数据的具体排列方式。
假设我们有个类型为int
变量x,位于地址0x100处。x的值为0x01234567。则地址范围为0x100 ~ 0x103。
大端法:
内存地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
十六进制数值 | 01 | 23 | 45 | 67 |
小端法:
内存地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
十六进制数值 | 67 | 45 | 23 | 01 |
你可以看到,小端法是反过来存储的。不幸的是,Android和IOS都是用小端法的。但值得庆幸的是,你只是个码农,根本不需要去解决这种小端法的字节顺序存储方式与处理器之间的兼容问题,太底层了,我们只需要知道有这么一回事就好,需要注意的是那些网络底层传输的字节顺序也有自己一套规则,这个将会讲解于在本书第十一章网络编程。
这里说一下,2.1.4的表示字符串和2.1.5的表示代码篇幅太短,所以不是重点。(整章唯一不是重点的地方)
从2.1.6开始就进入布尔代数的介绍,如果之前有良好的编程基础的你,可以直接跳过这些部分了。虽然这些内容都是重点,但基本上小护士在读本书两个月之前就总结一套简单的小笔记。
小笔记Github地址:
https://github.com/william8188/cheat-sheet/blob/master/bitwise/bitwise-and-bit-shift-essential.md
这是英文版的。小护士为了方便大家不用跳转链接,历经TCP三次握手四次挥手并把OSI七层参考模型和TCP/IP四层模型都撸一遍。就把上面小护士的小笔记的Fast Review的中英文版贴在这里。
There are three number and we assume that computer uses 8 bits to store a number.
存在abc三个数,假设计算机只用8位存储一个数字。则有:
if
a = 60
b = 13
c = 240
then
a = 0011 1100
b = 0000 1101
c = 1111 0000
if
a = 0011 1100
b = 0000 1101
then
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
if
a = 0011 1100
then
a<<2 = 1111 0000
a>>2 = 0000 1111
a>>>2 = 0000 1111
if
c = 1111 0000
then
c<<2 = 1100 0000
c>>2 = 1111 1100
c>>>2 = 0011 1100
2.2整数表示,从这一小节开始,就会进入带有复杂数学推理的整数的存储的实现原理。:)
大家做好从入门到放弃的准备,第二章信息的表示和处理(一)到此结束。请期待下一篇小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(二)。