标签:
(一)、三种重要的数字表示
无符号数:编码基于传统的二进制表示法(大于或者等于零的数字)。
补码:编码是表示有符号整数的最常见方式(为正或者为负的数字)。
浮点数:编码是表示实数的科学记数法的以二为基数的版本。
整数的表示虽然只能编码一个相对较小的数值范围,但是是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示是近似的表示。
大量的计算机安全漏洞都是由于计算机运算的微妙细节引发的。
(二)、信息存储
计算机最小的可寻址的存储器单位——字节
一个字节的值域:00H-FFH
以0x或0X开头的数字常量为十六进制
常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H)
转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字。
同理,二进制与八进制的转化是三位对应一位。
但是通常情况下,进制转换都以二进制为桥梁进行转换。
注:特殊情况
课本23页有这样一种情况,要表示的数字常量x=2的n次方时,n=i+4j,且0≤i≤3时,开头的十六进制数字为1(i=0)、2(i=1)、4(i=2)、8(i=3),后面跟随着j个十六进制的0。这里的j是代表着每四位二进制位对应的十六进制位,而i的范围是因为十六进制中每一位的范围是0-F,最多能容纳到8。这是一种方便快捷的计算方法。
字长决定虚拟地址空间的最大大小。
字长为w,虚拟地址的范围为1-(2^w-1)
w=32或64:也就是我们通常所说的电脑是32位还是64位。也可以理解为CPU一次处理数据的位数。
在不同字长的计算机中,相同的数据类型所占用的字节数并不相同,32位和64位的区别参见教材26页表格。
gcc -m32 可以在64位机上生成32位的代码
五、表示字符串
c语言中字符串被编码成为一个以null(值为0)字符结尾的字符数组
命令man ascii:得到ASCII字符码表
六、表示代码
二进制代码在不同的操作系统上有不同的编码规则。所以二进制代码是不兼容的
七、布尔代数
1.最简单布尔代数:与& 或| 非~ 异或^(结果为0或1)
2.扩展的布尔运算:位向量的运算(结果仍是位向量)
位向量的应用:表示有限集合,对集合编码
八、位级运算
1.将位向量按位进行逻辑运算,结果仍是位向量
2.掩码运算
掩码:用来选择性的屏蔽信号,是一个位模式,表示从一个字中选出的位的集合。
用位向量给集合编码,通过指定掩码来有选择的屏蔽或者不屏蔽一些信号,某一位位置上为1时,表明信号i是有效的;0表示该信号被屏蔽。这个掩码就表示有效信号的集合。
0xFF:屏蔽除最低有效字节之外的所有字节。
~0:生成全1的掩码
九、逻辑运算
1.逻辑运算符:与&& 或|| 非!
2.计算方法:所有非零参数都代表TRUE,0参数代表FALSE。1代表TRUE,0代表FALSE
十、移位运算
1.左移<<
2.右移>>
逻辑右移:在左端补k个0,多用于无符号数移位运算
算术右移:在左端补k个最高有效位的值,多用于有符号数移位运算。
整型数据类型——表示有限范围的整数,每种类型都能用关键字来指定大小,还可以指定是非负数(unsigned)还是负数(默认)。这些不同大小的分配的字数会根据机器的字长和编译器有所不同。
关于取值范围
具体范围见书38页。
要用C99中的“long long”类型,编译是要用 gcc -std=c99
编码方法见书,已经在很多门课程中都学习过了。
需要注意的是无符号数的二进制表示的一个重要性质:
0-(2^w)-1中的每一个整数和长度为w的位向量是一一对应的。
关于补码,一些可能没有注意过的知识:
有符号数的其他表示方法:
从位级角度考虑。
强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。即:这些位上的值不变,但是由于最高有效位的权重发生变化,从而导致结果发生改变。
负数——转换成大正数
以2的w-1次方为界限:
大于它——转换为负数值
六、扩展一个数字的位表示
扩展:从一个较小的数据类型转换为较大的数据类型,同时保持数值不变。
1.零扩展:在开头加上0。多用于无符号数转换为一个更大的数据类型。
2.符号扩展:添加最高有效位的副本。多用于补码数字转换
七、截断
截断:减少表示一个数字的位数。而这么做可能会改变它的值,这也是溢出的一种形式。
将一个w位的数截断为k位数字时,就会丢弃高w-k位。
浮点表示对形如V=x X (2^y)的有理数进行编码,适用于:
非常大的数字
非常接近于0的数字
作为实数运算的近似值
小数的二进制表示法只能表示那些能够被写成x X (2^y)的数,其他的值只能近似的表示。
权重
以小数点为界:
左边第i位,权重为2的i次幂
右边第i位,权重为1/2的i次幂
用V=(-1)^s X 2^E X M 来表示一个数:
符号:s决定这个数是正还是负。0的符号位特殊情况处理。
阶码:E对浮点数加权,权重是2的E次幂(可能为负数)
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
单独符号位s编码符号s,占1位
k位的阶码字段exp编码阶码E
n位小数字段frac编码尾数M(同时需要依赖阶码字段的值是否为0)
即exp的位模式既不全0也不全1的时候,这是最一般最普遍的情况,因而是规格化的。
即阶码域全为0时的数。
特殊值是在阶码位全为1的时候出现的。分为两种情况:
小数字段全为0
小数字段非0
舍入运算:找到和数值x最接近的匹配值x‘,可以用期望的浮点形式表示出来。
IEEE浮点格式定义了四种不同的舍入方法:
即:将数字向上或向下舍入,是的结果的最低有效数字为偶数。
能用于二进制小数。
即:把整数向下舍入,负数向上舍入。
正数和负数都向下舍入。
正数和负数都向上舍入。
int、float、double相互转换?
int → float 不会溢出但有可能舍入
int/float → double 结果保留精确数值
double → float 可能溢出为±∞,由于精确度较小也有可能被舍入
float/double → int 向零舍入,可能溢出。
P32页:位向量就是由一些二进制位组成的向量。位向量可以用很少的内存来存储Boolean变量。
标签:
原文地址:http://www.cnblogs.com/20135230pjy/p/4854880.html