第1章计算机系统概述,第一章计算机系统概论.ppt

本文深入探讨了计算机系统的基础,包括C语言中的表达式处理、运算规则、数据表示、指令执行、内存管理和异常处理。通过具体的例子,解释了在不同标准下C表达式的计算结果差异,以及程序执行时可能出现的访存异常和数据溢出问题。同时,文章还触及了编译器优化、操作系统异常处理和链接器的工作原理。
摘要由CSDN通过智能技术生成

文档介绍:

第一章计算机系统概论 生龙******@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转载请标明出处.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值