2.1 信息存储
2.1.1 十六进制表示法
一位十六进制数可以表示4位二进制数。
2.1.2 字数据大小
64位机器地址(指针)都为64位。
1个字节8位;1个字2个字节。
2.1.3 寻址和字节顺序
小端法:最低有效字节在前面,即与我们书写数字的方式相反。Intel x86都用小端模式。
大端法:最高有效字节在后面,与我们书写数字的方式相同。
2.1.4 位级运算和逻辑运算的差别
位级运算返回值与参数相关,逻辑运算只返回0(false)和1(true),所有非零数在逻辑运算中都认为是true。
2.1.5 移位运算
算数左移等价于逻辑左移。
算数右移补符号位,逻辑右移补0。
几乎所有编译器都对有符号数使用算数右移。
2.2 整数表示
2.2.1 整型数据类型
有无符号(有符号无表示,无符号unsigned)
长短(short 2字节,int 4字节,long 4或8字节)在C语言中可以随意组合。
2.2.2 无符号数的编码
没有符号位,每一位都为值。
2.2.3 补码编码
除了第一位为符号位,其余都为值。
2.2.4 反码编码
与补码的差别是正负数范围不同,反码正负数对称,补码正数比负数少1。
反码有-0(10000000),在补码中为-128
2.2.5 原码编码
负数与正数除了符号位没差别。
2.2.6 编码转换
正数都相同。
负数:原码只改符号位;反码符号位为1,其余位为正数按位取反;补码为反码+1。
2.2.7 有符号数和无符号数转换
对于位的转换,正数不变,负数,反向转换则正数不变,负数。
2.2.8 扩展
无符号数0扩展,有符号数符号扩展。
2.2.9 截断
截就完事了。截完后使用对应的公式得出值(无符号数,有符号数的补码表示)
2.3 整数运算
2.3.1 无符号数加法
加就完事了,竖式懂不懂?
加完判断下溢出:
加完后的值比x,y中任意值小则为溢出。
2.3.2 补码加法
加就完事了,竖式懂不懂?
加完判断下溢出:
正溢出
负溢出
2.3.3 补码的非
最小值不变,其余值按位取反+1。最小值其实也是取反+1。
2.3.4 无符号乘法
乘就完事,乘完截断。
2.3.5 补码乘法
截断后使用对应的公式获得值。
从位级表示来看,补码运算和无符号数运算没有差别,但同样的位级表示,在补码中表示不同的值。
2.3.6 乘以常数
将常数拆成2的幂运算,然后使用移位代替乘法。如,,。
2.3.7 除以2的幂
无符号数右移,补码加上偏置后右移。偏置为
2.4 浮点数
IEEE浮点标准:
32位:1位符号,8位exp,23位frac
64位:1位符号,11位exp,52位frac
1.规格化数
exp既不全为0也不全为1。
f和M都是小数,差别是f以0开头,M以1开头。
+1的操作使规格化数无法表示0。
2.非规格化数
为0000时飞规格化数的权重与阶码为0001时的规格化数的权重都为,使最小的规格化数和非规格化数平稳过度。