信息的表示和处理

现代计算机存储和处理的信息都是以二进制信号表示。因为二进制信号能够很容易的被表示,存储和传输。孤立的讲,单个的位不是非常的有用,然而,把位组合在一起,加上一定的解释,即给不同的位模式赋予含义。

我们研究最重要的三种数字表示:

  1. 无符号
  2. 补码
  3. 浮点数

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

2.1信息的存储

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

机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都有一个唯一的数字来标示,称为它的地址,所有可能的地址集合称为虚拟地址空间。

程序对象主要包括:程序数据,指令和控制信息。

2.1.1十六进制表示法

一个字节由8个位组成,在二进制的表示中,它的值域是00000000~11111111,如果用十进制数表示,它的值域是0~255.两种表示法对描述位模式来说都不是非常的方便,二进制太长,十进制转化比较麻烦。替换的方法是使用16进制。值域是00~FF。

在c语言中,我们使用0x或者0X来标示十六进制,字符‘A’~‘F’即可以是大写,也可以是小写,甚至是大小写混合。

2.1.2字

每台计算机都有一个字长,指明整数和指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。

2.1.3数据大小

计算机和编译器支持多种不同的方式编码的数字格式,如整数和浮点数,以及其他长度的数。

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

2.1.4寻址和字节顺序

2.2整数表示

2.2.1整形数据类型

我们知道使用有符号数来表示数据是不对程的,负数的曲直范围永远比正数的大1

非负数

unsigned

2.2.2无符号数的编码

无符号数的二进制表示有一个很重要的属性,就是每个介于0~2w-1之间的数都有一个唯一的w位的值编码。

无符号数能表示的最小数是[10..0](也就是说,设置这个位负权,但是清除了其他所有的位),而最大数是[01..1](清除具有负权的位,而设置其他位)

基本上所有的机器都是使用补码的形式来实现有符号整数。

2.2.3补码编码

2.2.4有符号数和无符号数的转化

处理的规则就是数值可能发生改变,但是位模式不变。

2.2.5C语言的有符号数于无符号数

C语言支持所有整型数据的有符号和无符号运算。几乎所有的机器都是采用补码的方式来实现有符号数。

C语言允许无符号和有符号数之间进行转化,转化的原则就是底层的位保持不变。

在执行运算的时候,如果它的一个数是有符号的,而另一个数是无符号的,那么C语言会将所有的有符号参数强制转化为无符号数。

2.3.6乘以常数

乘法指令是相当的慢,需要10个时钟周期,除法指令是更慢,需要30个时钟周期。

共有 0 条评论

Top