跳转至

第02章 信息的表示和处理

人类➡十进制——十根手指 机器➡二进制

无符号(unsigned)编码基千传统的二进制表示法,表示大于或者等于零的数字。 补码(two's-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。 浮点数(floating-point)编码是表示实数的科学记数法的以 2 为基数的版本。

计算机的表示法是用有限数量的位来对一个数字编码,因此,当结果太大以至不能表 示时,某些运算就会溢出(overflow)。

200*300*400*500 = —884 901 888

2. 1 信息存储

在大多数计算机系统中,内存的最小可寻址单位是字节(byte),而不是单独的位(bit)。具体来说,计算机在访问内存时,是以字节为单位进行操作的,而不是以单个位为单位。

位:计算机中最小的数据单位,可以是0或1。二进制数1010由4个位组成。

字节:8个位组成的一个数据块。二进制数10101010是一个字节。

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。

虚拟内存:将物理内存抽象为一系列连续的虚拟地址。主要目的是简化内存管理,提高内存使用效率,并为每个进程提供独立的内存空间。

内存的每个字节都由 一个唯一的数字来标识,称为它的地址(ad-dress), 所有可能地址的集合就称为虚拟地址空间 (virtual address space)

虚拟地址空间:所有可能的虚拟地址的集合。每个进程都有自己独立的虚拟地址空间。

想象一下,你在一个图书馆里找书。图书馆有很多书架,每个书架上有很多书。每本书都有一个唯一的编号(地址),你可以通过这个编号找到书的位置。 - 物理内存:图书馆的书架。 - 虚拟内存:图书馆的目录系统,它告诉你每本书的编号和位置。 - 虚拟地址空间:所有书的编号集合。 当你想找一本书时,你首先查找目录系统(虚拟内存),然后根据目录系统提供的编号找到书架上的具体位置(物理内存)。

2. 1. 1 十六进制表示法

一个字节由 8位组成。在二进制表示法中,它的值域是00000000₂~ 11111111₂ 。

用十六进制(hexadecimal)数,来表示位模式。 为什么要使用十六进制?二机制冗长,十进制与位转换麻烦。 C语言: 0x或 0X开头的数字常量表示十六进制 字符 'A'~'F' 既可以是大写,也可以是小写

2. 1. 2 字数据大小

每台计算机都有一个字长,指明指针数据的标称大小。

  1. 字长(Word Size) 例子:书架上的书 想象一下,你有一个书架,每个书架上可以放不同大小的书。书架的每一层就像计算机中的一个“字”。如果书架的每一层都只能放一本书,那么这个书架的“字长”就是一本书的大小。 在计算机中,字长指的是计算机一次可以处理的数据的大小。比如说,如果一台计算机的字长是32位(4字节),那么它一次可以处理32位的数据。如果字长是64位(8字节),那么它一次可以处理64位的数据。

虚拟地址以这样的一个字来编码

虚拟地址:程序运行时使用的地址,就像图书馆的书架编号

64位机器可以运行32位编译的程序——向后兼容

可移植性的一个方面就是使程序对不同数据类型的确切大小不敏感。

2. 1. 3 寻址和字节顺序

待学...

2. 1. 6 布尔代数简介

逻辑值 TRUE(真)和FALSE(假)编码为二进制值 1 和 0, 能够设计出一种代数,以研究逻辑推理的基本原则。

2. 1. 8 C 语言中的逻辑运算

逻辑运算与位级运算是不同的 最明显的区别是,逻辑运算符:||,位:| 前者是逻辑判断,返回的是布尔值;后者是位级运算,返回的是整数类型。

2. 1. 9 C 语言中的移位运算

//左移 <<:将操作数的位向左移动指定的位数,右侧用0填充
int a = 5;  // 二进制:0000 0101
int b = a << 1;  // 左移1位,结果:0000 1010,即10

//算术右移 >>:将操作数的位向右移动指定的位数。如果操作数是正数,左侧用0填充;如果操作数是负数,左侧用符号位填充
int a = 20;  // 二进制:0001 0100
int b = a >> 1;  // 右移1位,结果:0000 1010,即10

//右移分为算数和逻辑右移
//逻辑右移:不保留符号位,左侧始终用0填充。
unsigned int a = 20;  // 二进制:0001 0100
unsigned int b = a >> 1;  // 右移1位,结果:0000 1010,即10

2. 2 整数表示

无符号数:只能存储正数。

与此相对的是有符号数,能存储最小值和最大值

unsigned int a;
unsigned short b;

补码:用二机制表示正负数。在补码中,正数的表示与源码一样,负数的表示为将其绝对值的二进制形式取反,再加1。 +5的二进制原码表示为00000101,而-5的补码表示为11111011

编码:将信息从一种形式或格式转换为另一种形式的过程。 ASCII to binary 解码则为逆过程