深入理解计算机系统:数值的存储
关于计算几种的存储方式,总结如下:
1、只有ASCII字符构成的文件称为文本文件,ASCII用一个字节表示一个字符(0-127),其他的所有文件成为二进制文件。每种语言都有自己的编码标准,有了表,计算机就能将任何的字符映射到计算机中,进行二进制的处理。
2、编译的四个阶段:预处理(.i文件)-》编译(.s汇编文件)-》汇编(.o文件)-》链接(可执行文件)。
3、如何判断机器是大端还是小端:
定义一个函数,以unsigned char *的数组指针为参数,依次传入int、float等变量的地址,这时指针数组会把int看做一个4个字节的数组进行遍历输出,经过测试,win7采用的是小端方式,所谓大端就是大的在低地址,输出时俺正常的数输出。
4、交换操作:A = a^b, a= a^b,b=a^b;异或的基本属性:a^a=0,a^0=a;
5、int ival = 0x12345678 >> 32;相当于移动322=0位,当位移的范围超过类型的范围时,进行取模运算。
6、正数:在计算机中正常存储,负数:在计算机中一般存储的是补码,就是正数的反码+1。
7、无符号数转为有符号数:if < 0 2W+负数 else 一样。w为位数。
有符号数转为无符号数:if (w位==1) 正数-2w else 一样。w为位数。
其本质没有变化,只是在读取的时候,把第一位看做不同的符号。
8、类型的最小值=-类型的最大值-1;
9、short sx = -12345;unsigned uy = sx;
转换过程,先把sx扩充至32位,在转换为unsigned类型,也就是说,先扩充位数,在进行类型的转换。
10、一定要注意比较两边的类型,很容易出现unsigned与signed的比较,导致出错。最好不适用无符号数。
11、无符号数加法溢出:直接取余。
有符号加法溢出:正溢出:x+y-2w,负溢出:x+y+2w。w为位数。
补码非:补码的反码+1。-5的补码非为5。
12、无符号乘法:结果取余。
补码的乘法:两个有符号数相乘,先把有符号数转为无符号数,按照无符号乘法进行,再把无符号数转为有符号数。更为直接的方式是,把两个有符号数的结果,写出完整的补码形式,再截取最低位。
13、乘以常数,常常把常数转化为二进制,x*7=x*(8-1),进行移位(x<<n)+(x<<n-1)或者(x<<n+1)-(x<<m)
14、浮点数表示:
单精度:1:符号位,8:阶码,23:尾数。
双精度:1:符号位,11:阶码,52:尾数。
15、浮点数表示分类:
a)当阶码不全为0且不全为1时,属于规格化值:
M = 2单精度实际存储的阶码值-0111 1111(127)相当于10的几次方。
M = 2双精度实际存储的阶码值-011 1111 1111(1023)相当于10的几次方。
尾数=实际存储的尾数的小数值+1
值 = 尾数 x M
b)当阶码全为0时,非规格化值:
M =2 1-0111 1111
尾数 =实际存储的尾数的小数值
c)特殊值:
阶码全为1且尾数全为0,表示无穷大。
阶码全为1尾数不为0,便是NaN,即不是一个数。
浙公网安备 33010602011771号