写点什么

《深入理解计算机系统》读书笔记——第二章(一)

作者:如浴春风
  • 2022 年 5 月 04 日
  • 本文字数:1410 字

    阅读完需:约 5 分钟

本章主要介绍了计算机如何编码信息,及对信息的处理。

纲要

  • 常用进制介绍及转换:二进制、八进制、十进制、十六进制

  • 代码、字符串的表示,包含了字节序

  • 整数的表示和运算,及位扩展操作

  • 浮点数的表示和运算

信息的表示和进制介绍

如第一章所述,计算机系统内以二进制为基础进行设计,一个二进制位称为 1 比特。惯例上,计算机中将连续 8 比特(Bit)所组成的块,称为 1 个字节(Byte)。字节是最小的可寻址的内存单位。多个字节又可以组成不同的信息。

进制其实是个很常见的概念,生活中最多用到的是十进制。十进制的意思是:逢十进一,即

  • 它的每一位的取值范围为

  • 从右往左数,从 0 开始计算索引,第个元素的权重是


同理,二进制的每一位的取值范围为,第个元素的权重是 ;八进制的每一位的取值范围为,第个元素的权重是;十六进制比较特殊,它的每一位的取值范围最大值超过了 10,因此需要使用字母(不区分大小写)来表示,即以 A 表示 10,B 表示 11,C 表示 12,以此类推,所以它的每一位的取值范围为,第个元素的权重是


如果直接以二进制的形式呈现计算机的信息,那么多的 0 和 1 会使人眼花缭乱;而如果以十进制呈现,又不利于换算到二进制理解。所以通常呈现给人阅读时,采用十六进制展示比特位信息。

代码和字符串的表示

字长(Word size)

在计算机系统中有一个重要的概念:字长(Word size),一般是字节的整数倍,用于指明数据的标称大小。它所决定的最重要的一个系统参数就是虚拟地址空间的最大大小


举例来说:我们日常应该听过 32 位、64 位操作系统,说的就是字长的大小。如果是 32 位系统,它的可寻址地址范围为 ,即 4GB。

表示字符串

以 C 语言为例,字符串就是一个以 null 字符结尾的字符数组,每个字符数组由某个标准编码表示,用得最多的是 ASCII。


但请注意,还有其他许多字符编码集,如大名鼎鼎的 Unicode 集合(UTF-8、UTF-16),还有我们熟知的汉字编码字符集 GBK(GB2312)。在编写国际化的程序时尤为要注意⚠️!

表示代码

当 C 语言通过编译,翻译为机器语言后,源码中的变量名称等符号信息大多数被隐去,只剩下一个个指令和数据地址。其实从机器角度看,程序就是一个二进制序列。在学习汇编语言前一定要理解!

字节序(Byte order)

字节序,是指字节的排列顺序。这个概念仅对多字节对象有意义。

多字节对象存储在内存中时,必须考虑它的字节序问题,这个对程序正确运行非常重要。


一般而言,多字节对象在内存中是连续存储的。通常存在两种字节序:

  • 大端法(Big endian):该对象的最低有效位存储在分配给该对象的内存空间中的高地址

  • 小端法(Little endian):该对象的最低有效位存储在分配给该对象的内存空间中的低地址

如何记忆?只需要记住最低有效位的位置

  • 大端法:最低有效位在高(大)地址

  • 小端法:最低有效位在低(小)地址


通常,字节序与处理器操作系统两者有关。我们可以通过编码确认字节序,例子如下:

#include <stdio.h>#include <stdint.h>
int main() { int32_t a32bit = 0x1234; char* p32bit = (char *)&a32bit; if (p32bit[0] == 0x34) { printf("little endian"); } else { printf("Big endian"); } return 0;}
复制代码

思路非常简单,就是检查最低有效位是否符合某个预期。


上面获取多对象最低有效位的方式也可以通过 union 实现。

总结

今日学习了以下内容:

  • 计算机中信息如何表示

  • 字长和字节序的概念

发布于: 刚刚阅读数: 2
用户头像

如浴春风

关注

Full solution developer 2020.02.29 加入

前 Top 3 Android 手机厂商,相机开发工程师; 现 Android 音视频开发工程师。

评论

发布
暂无评论
《深入理解计算机系统》读书笔记——第二章(一)_5月月更_如浴春风_InfoQ写作社区