深入理解计算机系统 --- 信息的表示和处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_34916272/article/details/102642741

第一章对计算机做了个总体的介绍
接下来是深入讲解每个部分

本章研究在计算机上如何表示数字和其他形式的数据的基本属性
以及计算机对这些数据执行操作的属性

这章我只是简单的过一下
下一章 程序的机器级表示 会非常详细

苦心人、天不负,卧薪尝胆,三千越甲可吞吴

2.信息的表示和处理

现代计算机存储和处理的信息以二值信号表示,二进制数字或称为位(bit)
当构造存储和处理信息的机器时,二进制值工作得更好
二值信号能够很容易地被表示,存储,传输

孤立的讲,单个的位不是非常有用,把位组合在一起,再加上某种解释
即赋予不同的可能位模式以含义,我们就能够表示任何有限集合的元素

研究三种最重要的数字表示
无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字
补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是正/负数字
浮点数(floating-point)编码是表示实数的科学计数法的2为基数的版本

计算机用这些不同的表示方法实现算数运算

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

大量计算机的安全漏洞都是由于计算机算数运算的微妙细节引发

2.1信息存储

大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单元
而不是访问内存中单独的位

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存(virtual memory)
内存的每个字节都由一个唯一的数字来标识,称为它的地址(address)
所有可能的地址集合就称为虚拟地址空间(virtual address space)

这个虚拟地址空间只是一个展现给机器级程序的概念性映像
实际的实现是将动态随机访问存储器(DRAM)、内存、磁盘存储器等,操作系统软件集合结合起来,为程序提供一个看上去统一的字节数组

每个程序对象都可以简单地视为一个字节块,而程序本身就是一个字节序列

2.1.1十六进制表示法

在这里插入图片描述
一个字节由8位组成,二进制表示法中,值域是00000000~11111111
用16进制书写,一个字节的值域是00~FF

2.1.2字数据大小

每台计算机都有一个字长(word size),指明指针数据的标称大小(nomimal size)
虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小
一个字长为x位的机器而言,虚拟地址的范围为2^x – 1,程序最多访问2^x个字节

大多数64位机器也可以运行为32位机器编译的程序,这是一种向后兼容
64位机器编译的程序,只能在64位机器上运行
因此,区分”32位程序”或“64位程序”时,区别在于程序是如何编译的
而不是其运行的机器类型
在这里插入图片描述
计算机和编译器支持多种不同方式编码的数字格式,如不同长度的整数和浮点数
许多机器都有处理单个字节的指令,也有处理2字节,4字节或者8字节整数的指令
还有些指令支持表示为4字节和8字节的浮点数

有些数据类型的确切字节数依赖于程序是如何被编译的
整数或者为有符号的,即可以表示负数,零和正数
或者为无符号的,即只能表示非负数

注:关于有符号,无符号 我会补一个章节来详解

2.1.3寻址的字节顺序
对于跨越多字节的程序对象,必须建立两个规则:
1.这个对象的地址是什么
2.在内存中如何排列这些字节

几乎在所有的机器上,多字节对象被存储为连续的字节序列
对象的地址为所使用字节中最小的地址

假设一个类型为int的变量x的地址为0x100,那么x的4个字节将被存储在内存的
0x100、0x101、0x102、0x103位置
在这里插入图片描述
许多比较新的微处理器是双端法(bi-endian),也就是可以把它们作为大端或者小端的机器运行

2.1.4表示字符串

C语言中字符串被编码为一个null(值为0)字符结尾的字符数组,每个字符都由某个标准编码来表示,最常见的是ASCLL字符码

2.1.5表示代码

在这里插入图片描述
发现指令编码是不同的,不同机器类型使用不同的且不兼容的指令和编码方式
即使是完全一样的进程,运行在不同的操作系统上也会有不同的编码规则
因此,二进制代码是不兼容的

计算机系统的一个基本概念就是,从机器的角度来看,程序仅仅只是字节序列
机器没有关于原始源程序的任何信息,除了有些用来帮助调试的辅助表以外

2.1.6布尔代数简介

逻辑值TRUE (真) 逻辑值FALSE (假)
在这里插入图片描述
and & 与运算。
相同位的两个数字都为1,则为1;若有一个不为1,则为0。

or | 或运算。
相同位只要一个为1即为1。

xor ^ 异或运算。 真(1) 假(0)
真⊕假=真
假⊕真=真
假⊕假=假
真⊕真=假

2.1.7C语言中的位级运算

在这里插入图片描述

2.1.8C语言中的逻辑运算

在这里插入图片描述

2.1.9C语言中的移位运算

在这里插入图片描述
针对参数x的值,竖着看

2.2整数表示

本节中描述两种用位来编码整数的两种不同的方式
一种只能表示非负数
一种能够表示负数、零、正数
在这里插入图片描述
本节中描述两种用位来编码整数的两种不同的方式
一种只能表示非负数
一种能够表示负数、零、正数

2.2.1整型数据类型

C语言支持多种整型数据类型—表示有限范围的整数
在这里插入图片描述
为这些不同的大小分配的字节数根据程序编译为32位还是64位而有所不同
在这里插入图片描述


关于无符号有符号数,数据宽度

摘取:滴水逆向三期教程

在计算机中,受硬件的制约,数据都是有长度的(称为数据宽度)

关于有符号,无符号的概念,计算机不知道什么是有符号,无符号
这是由使用者来定义的,你把它当成什么看

在这里插入图片描述
无符号数:
0 1 2 3 4 ……. FF

有符号:
正数: 0 ……7F
负数:80 …… FF

无符号数,全是正整数和零
有符号数,负数,零,整数,如图的左半球为负数,右半球为正整数和0

都说最高位为1,代表的是负数,是在有符号数的情况下
如图 8F – FF ,的二进制位最高位都为1

在这里插入图片描述
32位和上边的概念一样,只不过能存储的空间更大

逻辑运算

在这里插入图片描述
在这里插入图片描述
电路图表示的非常有意思!

计算机是如何计算2+3的
首先两个容器保存2和3的二进制数值

0010
0011

在这里插入图片描述
首先进行异或运算,得到结果0001,保存在一个容器里
在这里插入图片描述
然后进行与运算,得到结果0010,左移1位为0100 发现位全不是0,继续运算
将上边异或出来的结果,和左移的结果0100 进行异或运算
在这里插入图片描述
从我们眼观来看,已经计算出正确结果了,但是计算机并不知道这是正确结果
在这里插入图片描述
然后又进行一层与运算,得到结果0000 左移一位 还是0000 就知道已经计算出正确结果了

原码反码补码

原码
最高位为符号位,其余各位为数值本身的绝对值

反码
正数:反码与原码相同
负数:符号位为1,其余位对原码取反

补码
正数:补码与原码相同
负数:符号位为1,其余位对原码取反加1

正数都一样
负数:补码

-1
原码:1 0 0 0 0 0 0 1
反码:1 1 1 1 1 1 1 0
补码:1 1 1 1 1 1 1 1

-6
原码:1 0 0 0 0 1 1 0
反码:1 1 1 1 1 0 0 1
补码:1 1 1 1 1 0 1 0

在这里插入图片描述
-1,-6的十六进制分别为
FF — 1111 1111
FA — 1111 1010
由此可见,负数是以补码的形式

关于浮点数,看书了解详情。

猜你喜欢

转载自blog.csdn.net/qq_34916272/article/details/102642741