三种最重要的数字表示法
无符号:基于传统的二进制表示法,大于等于0
补码:有符号整数
浮点数:实数的科学计数法的以二进制为基数的版本
信息存储
最小的可寻址存储器单位:字节
虚拟存储器:每个字节都由唯一的数字标识,称为地址
虚拟地址空间:所有可能地址的集合
每个程序对象可视为字节块,程序本身是一个字节序列
十六进制表示法
一个字节由8 位组成。
在二进制表示法中,它的值域是000000002 ~ 111111112 ;
如果用十 进制整数表示,它的值域就是010 ~ 25510。
用十六进制书写,一个字节的值域为0016 ~ FF16。
字
字长(word size),指明整数和指针数据的标称大小(nominal size)
“char”是由于它被用来存储文本串中的单个字符这一事实而得名,但它也能用来存储整数值。
ISO C99 引入的“长长”整 数数据类型允许64 位整数。对于32 位机器来说,编译器必须把这种数据类型的操作编译成执行
一系列32 位操作的代码。(64位机 :gcc -m32 生成32位的代码)
整数运算
无符号加法:可以被视为模运算形式,等价于计算和模2^w。在我的理解看来应该就是跟溢出差不多的性质。运算的溢出是指完整的整数结果不能存放到数据类型的字长限制中。
补码加法:负溢出得到的结果比整数和大16,正溢出得到的结果比整数小16.
补码的非&
无符号乘法计算公式。
补码乘法:给定长度的两个为位向量,无符号乘积的位级与补码乘积的位级表示是相同的,表明及其可以用一种乘法指令来进行有符号数和无符号数的乘法。无符号和补码乘积的低位是相同的
乘以常数:为了缩短计算时间,试着用移位和加法运算的组合来代替乘以常数的乘法。推理过程看书。
除以2的幂:除法比乘法的计算时间更长。除以2 的幂用右移而不是左移。同样推理过程仔细阅读书上的内容。
关于整数运算:整数运算实际是一种模运算。表示数字的有限字长限制了可能的取值范围,结果可能溢出。补码提供了技能表示正数也能表示负数的灵活方法,同时使用了与执行无符号算数相同的位级实现。
浮点数
1.二进制小数
定点表示法:“.”为界(不能有效的表示很大的数)
十进制:小数点左边的数字的权是10的非负幂,得到整数值;右边的数字的权是10的负幂,得到小数值。
二进制:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。
2.IEEE浮点表示
用V = (-1)s * M * 2E的形式来表示一个数:
符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
将浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段exp = ek-1…e1e0编码阶码E。
n位小数字段frac = fn-1…f1f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
两种常见的格式
C语言中的单精度浮点格式float 和双精度浮点格式double。
在float中,s、exp和frac字段分别为1位、k = 8 位和n = 23位,得到一个32位的表示;
在double中,s、exp和frac字段分别为1位、k = 11 位和n = 52位,得到一个64位的表示。