信息的表示和处理
一、信息存储。
1、数字表示
无符号编码 基于二进制表示法
补码编码 有正有负
浮点数编码
2.信息存储
在二进制表示法中,它的值域是00000000(2)~11111111(2);如果用十进制表示就是0(10)~255(10);
十六进制的表示:0X或者Ox开头的数字常量。)
字长:指明整数和指针数据的标称大小。
字长决定的最重要的系统参数就是虚拟地址空间的最大大小。
寻址和字节顺序:
通常,多字节对象都被储存为连续的字节序列,对象地址为所使用字节中最小的地址。
小端法----最低有效字节在最前面的方式;
大端法----最高有效字节在最前面的方式;
双端法 许多微处理器使用
反汇编器:是一种确定可执行程序文件所表示的指令序列的工具。
表示字符串
C中字符串被编码为一个NULL(值为0)字符结尾的字符数组。每个字符都有某个标准编码来表示。最常见的是ASCII码。
最简单的布尔代数二元集合{0,1}
位向量:有固定长度为w、有0和1组成的串。位向量运算可以定义成参数的每个对应元素之间的运算。集合编码
位极运算:实现掩码运算,这里的掩码是一个位模式,表示从一个字中选出的位的集合。
确定一个位级表达式的结果的最好的方法,就是将十六进制的参数扩展到二进制表示并执行二进制运算,再转换回十六进制。
逻辑运算
逻辑运算认为所有非零的参数都表示TRUE,而参数0表示FALSE.他们返回1或者0;按位运算只有在特殊情况下,也就是参数被限制为0或者1时,
区别2: 如果对第一个参数求值,就能确定表达式的结果,那么逻辑运算就不会对第二个参数求值。C语言标准并没有明确定义应该使用哪种类型的右移,对于无符号数据,右移必须是逻辑的。对于有符号数据,算术的或者逻辑的右移都可以。实际上,几乎所有的编译器/机器组合都对有符号的数据使用算术右移,且许多程序员都假设机器会使用这种右移。
二、整数表示。
整型数据类型
用位来编码整数的两种方式:一种只能表示非负数,而另一种只能表示负数、零和正数。
整数数据类型——表示有限范围的整数,每种类型都能用关键字来指定大小,而不同大小的分配字节数会根据机器的字长和编译器有所不同。
根据字节分配,不同的大小所能表示的值的范围是不同的。
无符号数编码
有符号数和无符号数之间的转换
转换的原则是底层的位表示不变
零扩展——将一个无符号数转换为一个更大的数据类型,表示在开头加0。
符号扩展——将一个补码数字转换为一个更大的数据类型。
三、整数运算
无符号数加法
一个算术运算溢出,是指出完整的整数结果不能放到数据类型的字长限制中去。
乘以常数 无论是无符号运可能算还是补码运算,乘以2的幂都会导致溢出。
四、浮点数
当一个数字不能被准确的表示为这种格式,就必须向上调整或者向下调整
二进制小数
第一步是考虑含有小数值的二进制数字。
IEEE浮点表示
符号 尾数 阶码
三种情况:规格化的值 非规划的值 特殊值
舍入
浮点运算
感想小结:通过研究数字的实际表示,理解可以表示的值得范围和不同算术运算的属性。了解这些属性,使我对让编写的程序能在全部数值范围内正确工作,而且具有可以跨越不同机器、操作系统和编译器组合的移植性有了更深一步的理解。大量计算机的安全漏洞都是犹豫计算机算术运算的微妙细节引发的,需要我们去进一步了解。