1、机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器(virtual memory);
字长:指明整数和指针的标称大小(nominal size);
虚拟地址由一个字长编码,即字长决定虚拟地址空间的大小;
eg:字长为32位的机器,虚拟地址空间为:2^32Byte = 4GByte;
2、由于CPU的字节顺序有大端法(big-endian)和小端法(litter-endian)两种表示方法,所以二进制代码不适合移植;
而用ASCII码表示的文本数据,字符不分高低字节,最前面的字符最低地址,所以文本数据比二进制数据具有更强的平台独立性;
P28页的程序可以用来测试CPU大小端;
3、整数编码
3.1 、无符号编码(binary to unsigned):对应C语言中的unsigned;
补码编码(two‘s-complement):对应C中的有符号数;几乎所有的机器都是用补码来表示有符号数。
3.2、 有符号数和无符号数的转换
有符号-->无符号 : 当x>=0时, T2U(x) = x ; 当x<0时,T2U(x) = x + 2^w ;其中w为数据类型的二进制位数;
无符号-->有符号: 当u<2^(w-1)时,U2T(u) = u;当u>=2^(w-1)时,U2T(u)= u - 2^w ;其中w为数据类型的二进制位数
3.3 C中,当执行一个运算数时,如果它的一个运算符是有符号另一个是无符号,那么C隐式的将有符号转换为无符号,并假设两个数都为非负数;
两个数相减:eg: 1u - 2 = 1 + T2U(-2) ;得到的值并不直观;
4、整数运算 (其中w为数据类型的二进制位数)
4.1 、无符号数相加:
x+y = x +y,x+y<2^w;
x+y = x+y-2^w, 2^w<=x+y<2^(w+1); //溢出
4.2、补码相加:
x+y = x+y-2^w , 2^(w-1)<=x+y 正溢出
x+y = x+y, - 2^(w-1)<=x+y<2^(w-1) 正常
x+y = x+y+2^w, x+y<-2^(w-1) 负溢出
5、浮点数
参考:http://blog.csdn.net/Microsues/archive/2011/03/01/6214646.aspx
为什么打印:0.10000000000000001000
原因:0.1即1/10,它无法由52位尾数精确的表示出来,所以发生了舍入。
当float的23位尾数或者double的52为尾数无法精确的表示一个实数时,就会发生舍入。
计算机中浮点的舍入:参考http://www.madongfly.cn/articles/floating_point_rounding.html
P28页的程序(show_float() )可以用来打印浮点数在内存中实际的存储内容。
6、 C语言中: int,float,double之间的强制转换 P78
见代码标注:
打印结果: