-
为什么使用二进制?
二值信号能更容易地被表示、存储、传输 -
三种最重要的数字表示:
- 无符号
- 补码:表示有符号整数
- 浮点数
-
计算的表示是有限数量的,因此,答案太大时,结果会溢出
-
浮点运算的精度有限,不可结合(指-1 + 1 != 0)
-
整数能表示小范围的精确的数值,浮点数能表示大范围的近似的数值
-
大量计算机的安全漏洞都是由于计算机算数运算的微妙细节引起的
信息存储
-
最小的可寻址单位:byte,8个位组成。
-
虚拟内存:将内存视作一个非常大的char数组
-
尽管C编译器维护着指针的类型信息,但是实际生成的机器级程序不包含这个信息
-
每个程序对象可以视为一个字节块,而程序本身就是一个字节序列
十六进制表示法
-
为什么使用十六进制表示法:
一个字节8位,有16种取值,使用二进制过于冗长,使用十进制需要进制转换。因此,十六进制刚刚好。 -
二进制、十六进制、十进制之间的相互转换
二进制<->十六进制,可以一次执行一个十六进制数组的转换,4位二进制一组。不足4的倍数,将最左边的一组用0补足。
十六进制<->十进制:窍门:记住A、C、F对应的数字,将B、D、E的值通过计算与前三个值的关系记住(A:10 C:12 F:15)
当x = 2^n时,只要记住x写成二进制就是1后面跟n个0,就很容易写成十六进制。将n表示为i + 4j的形式。(0 <= i <= 3)(0: 0, 1: 2, 2: 4, 3: 8)
例子:2048 = 2^11, 11 = 4 × 2 + 3,=> 0x800
十进制->十六进制:用16除,得商q与余数r=> x = q · 16 + r。倒着来:例如余数12 2 11 12 4,则从4开始,转为16进制:4 C B 2 C
字数据大小
-
字长决定的最重要的系统参数:虚拟地址空间的最大大小
-
字长为w位,虚拟地址的范围:0~2^w - 1
-
大多数64位机器能运行32位机器编译的程序(向后兼容)
-
32位程序/64位程序:程序是如何编译的,而不是运行的机器类型
-
计算机和编译器支持多种不同方式编码的数字格式
-
为了避免由于编译器不同导致的错误,C99引入了一类数据类型,例如int_32t与int_64t,大小固定,不随编译器变化而变化(stdint.h)
-
char:不保证它是有符号或者无符号
-
可移植性的一个方面:使得程序对不同数据类型的确切大小不敏感
-
注意:在32位程序中,char的指针为4位,而是64位程序中,char的指针位8位
寻址与字节顺序
- 对跨多字节对象建立两个规则(如int):
- 对象地址在何处
- 如何排序
如int a,地址为&a = 0x100,字节排列为0x100、0x101、0x102、0x103
- 假设一个变量值:0x01234567 高位<-低位
->地址变大方向
大端法排序:01 23 45 67:高位->低位
小端法排序:67 45 23 01:低位->高位
大多数Intel兼容机使用小端模式
双端法:可以进行配置
实际情况:使用了特定操作系统后,字节顺序便固定了下来
Android与iOS只能使用小端模式
- 对于大多数应用程序的程序员来说,机器使用的字节顺序是完全不可见的
产生影响的情况:
- 网络传输时需要遵守有关字节顺序的规则
- 小端法机器生成的机器代码低位在左边,高位在右边,要反着读
- 编写规避正常类型系统的程序。C语言可以使用强制类型转换或联合类型来允许一种数据类型引用一个与创建这个对象时定义的数据类型与该数据类型不同的对象。
#include <