(二)信息存储

来源:互联网 发布:网络爬虫源码 编辑:程序博客网 时间:2024/06/16 14:58

现代计算机存储和处理都是基于二进制的位,单个的二进制位并不具备含义,但是把它们组合在一起,再加上某种解释,就可以表示任何有限集合的元素。本章将研究三种最重要的数字表示方法:无符号数、补码和浮点数。研究这些表示方法是有意义的,能够理解可以表示的值的范围和不同的运算属性,使编写的程序更加健壮、更加具有移植性。

大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的存储器单位。机器程序将存储器视为一个非常大的字节数组,其中的每个字节都由一个唯一的数字来标识,成为它的地址。所有可能的地址的集合成为虚拟地址空间。

十六进制表示法

一个字节由8位组成,为了方便表示(二进制太长,十进制不直观),使用十六进制来表示。

每台计算机都有一个字长,指明整数和指针数据的标称大小。也就决定了计算机的虚拟地址空间的最大大小。

数据大小

不同数据类型在32/64位机器上的字节数是不同的:

C类型 32位机器 64位机器 char 1 1 short int 2 2 int 4 4 long int 4 8 long long int 8 8 char * 4 8 float 4 4 double 8 8

寻址和字节顺序

对于跨字节的程序对象,必须建立两个规则:这个对象的地址是什么,以及在存储器中如何排列这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用的字节中最小地址。例如一个类型为int的变量x首地址是0x100,那么代表&x的值为0x100,存储这个变量的四个字节为0x100,0x101,0x102,0x103。
确定了存储地址,还需要将字节序列存到这些地址中去。这里有两种方法:
- 大端法:低有效位存在高位地址;
- 小端法:低有效位存在低位地址;
例如一个int类型的变量,值为0x1234567,位于地址0x100处,那么地址范围即为0x100~0x103,如果按大端法存储即为:
01 23 45 67
但是按照小端法存储,则为:
67 45 23 01
(端的起源了来自于格列佛游记中的剥鸡蛋战争)

表示字符串

C语言中字符串被编码为一个以null字符结尾的字符数组。每个字符都由某个标准编码来表示,最常见的是ASCII字符码。使用ASCII码作为字符码的任何系统上的表示结果都相同,与字节顺序和字节大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性。

位运算

C语言的一个很有用的特性就是它支持按位布尔运算。布尔代数中的位向量可以很巧妙的表示有限集合,从而实现计算机中位的运算。
位级运算的一个常见用法是实现掩码运算。这里的掩码是一个位模式,表示从一个字中选出的位的集合。

逻辑运算

逻辑运算的功能和位运算完全不同:
1. 逻辑运算认为所有非0的参数都表示TRUE,而参数0表示FALSE。
2. 如果对一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值;

位移运算

算数位移:补最高有效位,常用于补码,即有符号数的位移;
逻辑位移:补0,常用于无符号数的表示;

0 0