第二章:信息的表示和处理
1、 无符号数:编码基于传统的二进制表示法表示大于或等于零的数字。
2、 补码:编码是表示有符号整数的最常见方法,可以是正或者是负的数字。
3、 浮点数:编码是表示实数的科学计数法的以二位基数的版本。
对比:
整数运算只能编码相对较小的范围,但是是精确的;
浮点运算可以编码一个较大的范围,但是是近似的;浮点运算不可结合。
注意:溢出——运算位数的限制
计算机最小的可寻址的存储器单位——字节
一个字节的值域:00H-FFH
缓冲区溢出漏洞:
计算机的表示法是用有限数量的位来对应一个数字编码,当结果太大不能表示时就会发生溢出。人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区这时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
①信息存储
字长
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都能由唯一的数字来标识,称为地址。字长用来指明整数和指针数据的标称大小,虚拟地址空间的大小由字长决定,对于一个字长为w位的机器而言,虚拟地址的范围为0-2^w-1。
数据大小
程序可移植性的要求是使程序对不同数据类型的确切大小不敏感
gcc -m32 可以在64位机上生成32位的代码
1.寻址和字节顺序
小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象。
大端法——从最高有效字节到最低有效字节的顺序存储。
(小端法:高对高,低对低。大端法:高对低,低对高。)
举例:变量x十六进制值为0x01234567
2.表示字符串
ASCⅡ字符码
a-z的ASC||码为0x61-0x7A。
3.表示代码
二进制代码是不兼容的。
4.布尔代数
二进制值是计算机编码、存储、操作信息的核心(0、1)
逻辑运算——0或1
位运算————位向量
~=NOT
&=AND
|=OR
^=异或
*位向量:有固定长度为w,由0、1组成的串。每个对应元素之间的运算。 掩码。通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号。(0表示被屏蔽)
5.C语言中的位级运算
我们在布尔运算中使用的那些符号就是C语言所使用的:
|就是OR(或)
&就是AND(与)
~就是NOT(取反)
^就是EXCLUSIVE-OR(异或)
6.C语言中的逻辑运算
|| OR
&& AND
! NOT
所有非零的参数表示TRUE
参数0表示FALSE
它们返回1或者0,分别表示结果为TRUE或FALSE
7.C语言中的移位运算
(1)x<<k 表示x向左移动k位
(2)x>>k 表示逻辑右移或算术右移
②整数表示
1. 无符号数编码
数据类型long long是在ISO C99中引入的。(编译:gcc -std=c99)。
64位机器用8个字节表示;32位机器用4个字节表示。
*负数的范围比整数的范围大1。
2.补码编码
最常见的有符号数的计算机表示方式。
正数的补码=原码
负数的补码=原码各位取反再加1
最高有效位也叫符号位。
3.无符号数与有符号数转换
强制类型转换的结果保持位值不变,改变解释这些位的方式。
处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变)
无————>有:U2Tw函数
有————>无:T2Uw函数
*w表示数据类型的位数
4.扩展数字的位表示
零扩展:将一个无符号数转换为一个更大的数据类型,在开头添0。
符号扩展:将一个补码数字转换为一个更大的数据类型,添加最高有效位的值的副本。
5.截断数字
可能会改变数值——溢出的一种形式。
对于无符号数字x,截断到k位,相当于计算:x mod 2(k)。(k次幂)
③整数运算
1. 无符号加法是一种模运算形式。
2.溢出
一个算术运算的溢出——完整的整数结果不能放到数据类型的字长限制中。
x+y>=x,若s没有溢出,可以肯定s>=x;若s溢出,s=x+y-2^(w).
*s=x+(u w)y. x>=0,y<=2^(w)-1,均是非负整数。
整数运算实际上是一种模运算形式。表示数字的有限字长限制了可能的值得取值,结果可能溢出。
④浮点数
1.二进制小数
定点表示法:“.”为界(不能有效的表示很大的数)
十进制:小数点左边的数字的权是10的非负幂,得到整数值;右边的数字的权是10的负幂,得到小数值。
二进制:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。
2.IEEE浮点表示
1.用V = (-1)s * M * 2E的形式来表示一个数:
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
2.将浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段exp = ek-1…e1e0编码阶码E。
n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
3.两种常见的格式
C语言中的单精度浮点格式float 和双精度浮点格式double。
在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示;
在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示。
6.作业重点题目:
2.4、2.6、2.8、2.11、2.14、2.18、2.19、2.23、
2.24、2.25、2.27、2.29、2.33、2.39、2.40、2.42、
2.44、2.45、2.47、2.50、2.52
原文:http://www.cnblogs.com/KG35/p/4861942.html