文档介绍:
第一章计算机系统概论 生龙******@hebeu.2016年9月6日
主要内容
课程的由来
课程内容概要
课程基本信息
硬件和软件的基本组成
程序的开发和执行过程
计算机系统层次结构
计算机性能评价
用“系统思维”分析问题
ISO C90标准下,在32位系统上
以下C表达式的结果是什么?
-2147483648 < 2147483647
false(与事实不符)!Why?
ISO C99标准下为true,Why?
以下关系表达式结果呢?
int i = -2147483648;
i < 2147483647
true!Why?
-2147483647-1 < 2147483647,结果怎样?
理解该问题需要知道:
编译器如何处理字面量
高级语言中运算规则
高级语言与指令之间的对应
机器指令的执行过程
机器级数据的表示和运算
……
用“系统思维”分析问题
sum(int a[ ], unsigned len)
{
int i,sum = 0;
for (i = 0; i <= len–1; i++)
sum += a[i];
return sum;
}
当参数len为0时,返回值应该是0,但是在机器上执行时,却发生访存异常。但当len为int型时则正常。Why?
当用len=0调用sum函数时,其返回值应该是多少?
理解该问题需要知道:
高级语言中运算规则
机器指令的含义和执行
计算机内部的运算电路
异常的检测和处理
虚拟地址空间
……
若x和y为int型, 当x=65535时, y=x*x; y的值为多少?
y=-131071。Why?
现实世界中,x2≥0,但在计算机世界并不一定成立。
对于任何int型变量x和y,(x>y) == (-x
当x=-2147483648,y任意(除-2147483648外)时不成立
Why?
在现实世界中成立,
但在计算机世界中并不一定成立。
用“系统思维”分析问题
理解该问题需要知道:
机器级数据的表示
机器指令的执行
计算机内部的运算电路
用“系统思维”分析问题
打印结果是什么?
d=0,x=1 072 693 248
Why?
double d;
void p1( )
{
d=1.0;
}
int d=100;
int x=200;
int main()
{
p1( );
printf (“d=%d, x=%d\n”, d, x );
return 0;
}
main.c p1.c
理解该问题需要知道:
机器级数据的表示
变量的存储空间分配
数据的大端/小端存储方式
链接器的符号解析规则
……
用“系统思维”分析问题
/* 复制数组到堆中,count为数组元素个数*/
int copy_array(int *array, int count) {
int i;
/* 在堆区申请一块内存*/
int *myarray = (int *) malloc(count*sizeof(int));
if (myarray == NULL)
return -1;
for (i = 0; i < count; i++)
myarray[i] = array[i];
return count;
}
当参数count很大时,则count*sizeof(int)会溢出。如count=230+1时, count*sizeof(int)=4。
堆(heap)中大量数据被破坏!
理解该问题需要知道:
乘法运算及溢出
虚拟地址空间
存储空间映射
……
当count=230+1时, 程序会发生什么情况?
用“系统思维”分析问题
代码段一:
int a = 2147483648;
int b = a / -1;
printf("%d, %d \n", a, b);
运行结果为
-2147483648, -2147483648
代码段二:
int a = 2147483648;
int b = -1;
int c = a / b;
printf("%d, %d\n", a, c);
运行结果为“Floating point exception”,显然CPU检测到了溢出异常
上述结果在Linux上获得,为什么两者结果不同?
在Windows上运算的结果又为何不同?
理解该问题需要知道:
机器级数据的表示
(如:真值和机器数的关系)
机器指令的含义和执行
(如:取负指令、除法指令)
计算机内部的运算电路
(如:除法电路会判是否异常)
编译器如何优化
(如:a/-1可用取负指令实现)
操作系统如何处理异常
(如:除法错异常的处理)
……
Warn
内容来自淘豆网www.taodocs.com转载请标明出处.