读书笔记系列深入理解计算机系统之信息的表示和处理

前言

大量计算机的安全漏洞都是由于计算机算术运算的微妙细节引发的,了解这种属性,使编写的程序能在全部数值范围内正确工作是我们的目的。 整数运算和浮点数运算会有不同的数学属性是因为他们处理数组表示有限性的方式不同,整数的表示编码一个较小的数值范围,这种表示是精确的;浮点数虽然可以编码一个较大的数值范围,但这种表示是近似的。

信息存储

计算机最小存储单位是 位(bit) 8-> 字节(byte) 1024-> KB 1024-> MB 1024-> G 1024-> T

最小的可寻址内存单位是字节(byte),一字节等于八个位(bit),机器级程序将内存视为一个大的字节数组,内存中每个字节都用一个唯一的数字来标识,称为它的地址;

十六进制表示法

一个字节8个位,二进制表示范围00000000~11111111,十进制表示范围0~256,两种模式描述都不是很方便,于是就出现了16进制表示00~FF。十六进制通常以OX开头标识这是一个十六进制值

十六进制转二进制 方法 每一位十六进制分别展开为4位二进制,如图:

此处输入图片的描述

二进制转十六进制 方法 从右到左,每四位二进制转换为以为十六进制,不足的补位0,如图:

此处输入图片的描述

十进制转十六进制 方法 将十进制数值x不断用16除,得到商q和余数r,用r表示十六进制最低位,然后不断对得到的q用16除得到余下十六进制位,如图:

此处输入图片的描述

十六进制转十进制 方法 将十六进制数值x的每一位乘以16,并将得到积相加,给点Ox7AF,通过计算7 * 16 * 16 + 10 * 16 + 15

字数据大小

每台计算机都有一个字长表示指针数据的标称大小(操作系统一次传输的数据的大小),虚拟地址用一个字来编码,字长的大小决定虚拟地址空间大小,字长为w的机器,虚拟地址范围0~2的w次方 - 1,程序最多访问2的w次方字节 现在32位机限制4GB(32位操作系统一次传输4byte的数据,这时一字等于4byte,4byte的数据最多表示4G的内存地址,所以32位系统最多只能用到4GB内存),64位位16EB 有些数据类型确切字节数依赖于32和64位系统

寻址和字节顺序

跨多字节程序对象都被存储为连续字节序列,对象地址为所使用字节中最小的地址,然后根据类型大小得到存储位置。在地址中有最高位和最低位,从而得到有最高有效字节和最低有效字节,有些机器按照从最高到最低存储对象,有些则按照从最低到最高存储对象,前者被称为大端法,后者被称为小端法

表示字符串

C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组,每个字符都以标准编码来标识(ascll),在使用ascll作为字符码的任何系统都得到相同结果,与字节属性和字大小无关,文本数据比二进制数据更强的平台独立性

布尔代数

二进制值是计算机编码,存储和操作信息的核心,因此可以利用布尔代数进行非,且,或,异或等布尔运算,许多语言,如java,c中有逻辑运算,逻辑运算和布尔运算是不同的,逻辑运算只会返回0和1;顺便还涉及到移位运算,左移运算右边的位数补0,在java和c中用«表示,但右移运算分为逻辑右移和算术右移,前者左边位补0,后者右移后左边位补最高有效位的值,在java中使用«进行算术右移,«<进行逻辑右移,如图 此处输入图片的描述

整数表示

整数主要是分为无符号数有符号数,数据类型主要是char short int long int32 int64。 有符号和无符号区别在于最高位的解释权,在大多数c语言的实现中,处理同样字长的有符号数和无符号数之间相互转换一般规则:数值可能会变,但是位模式不变。也就是解释这些位的方式改变。而机器级则是使用补码的方式实现。 扩展一个无符号数字的位表示(转换为较大的数据类型),只需要简单的在开头添加0,这种运算称为零扩展 扩展一个有符号数字的位表示(将一个补码数字转换为一个更大的数据类型),通过添加最高有效位的值 无符号加法,如果结果超过类型大小会发生溢出情况 对于x数值都有-x作为其加法的逆 ….

浮点数表示

浮点数的二进制表达 定点表示法:点左边位是2的正幂,点右边位是2的负幂(不能有效表达非常大的数字) IEEE浮点表示:

舍入的类型:向偶数舍入,向零舍入,向下舍入,向上舍入

文本文件

不管是浮点数,还是整数,采用二进制序列化会比存储文本省下不少空间(ASCALL码表示的二进制数据)