小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(一)

小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(一)

欢迎来到小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(一);本文与第一章不同,因原书书写篇幅从第二章开始就变得很大,所以小护士决定先介绍第二章的基本内容,然后进入本文的主要笔记内容: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整数表示开始就出现很多数学原理和推理;稍微不留神都会被某些地方卡半个小时。但是,如果你之前就具备良好的编程基础以及布尔代数基础,第二章绝对难不倒你。反之,你会直接进入最后一关:放弃。

  • 2.1信息存储,主要讲计算机如何存储二进制的数据,例如小端法和大端法这两种存储方式,同时还讲了一些布尔代数运算的基础,这就是我们熟悉的位运算和位移运算(Bitwise & Bit Shift)以及逻辑运算。
  • 2.2整数表示,主要说明有符号数和无符号数那些实现原理,例如有符号数会涉及到补码(Two’s Complement)处理。
  • 2.3整数运算,则具体描述计算机如何给二进制数据做加减乘除运算,这里面还会继续分别讲解有符号数和无符号数的处理。
  • 2.4浮点数,则单独地讲解计算机如何表示有小数点的数据,并如何做运算,但最重要的是浮点数精度限制问题的讲解。

好吧,基本内容介绍完了,下面进入本文主题。

2.1 信息存储

2.1.1 十六进制表示法

为什么骨灰级的计算机高手喜欢用十六进制表示数值?因为十六进制恰好可以直接翻译为二进制数据,反之亦然。怎么做?

下面小护士把原书的表格稍微优化一下表示出来,大家就明白了。

十进制 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

是不是很有趣咧。:)

2.1.2 字数据大小

计算机里面有这么一个东西叫字长(word size)。啥意思?它就是代表计算机一次处理数据的长度(设长度为N,则字长为N个比特),或官方地来讲就是指明指针数据的标称大小(nominal size)。这里还讲到了虚拟地址,因为计算机以一个字来编码地址的,所以,现实世界中,32位系统可以访问的虚拟地址空间为4GB,而64位系统则可以访问的虚拟地址空间为16EB。小结一下,对于一个字长为N位的计算机来说,虚拟地址的范围为 0 0 ~ 2n1 2 n − 1

大胆猜测一下,如果物理内存有16EB这么大,恰好充分利用64位系统访问虚拟地址的范围,此时对于MySQL来说,基本没B+树什么事了。

2.1.3 寻址和字节顺序

有没有听说过大端法和小端法。(没听说过)

它们俩都是存储数据的具体排列方式。

假设我们有个类型为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~2.1.9 布尔代数及其运算规则

从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的中英文版贴在这里。

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 预告

2.2整数表示,从这一小节开始,就会进入带有复杂数学推理的整数的存储的实现原理。:)

大家做好从入门到放弃的准备,第二章信息的表示和处理(一)到此结束。请期待下一篇小护士读书笔记系列之《深入理解计算机系统》第二章信息的表示和处理(二)。

你可能感兴趣的:(深入理解计算机系统,读书笔记)