C语言基础一之预备知识(计算机结构组成、计算机系统组成、进制、原码反码补码)
一. 计算机介绍
1.计算机结构组成
冯·诺依曼体系结构冯·诺依曼理论的要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
根据冯·诺依曼体系结构构成的计算机,必须具有如下功能:把需要的程序和数据送至计算机中。必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。能够按照要求将处理结果输出给用户。
将指令和数据同时存放在存储器中,是冯·诺依曼计算机方案的特点之一 计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成 冯·诺依曼提出的计算机体系结构,奠定了现代计算机的结构理念。
2.计算机系统组成
3.程序和指令
指令是对计算机进行程序控制的最小单位。
所有的指令的集合称为计算机的指令系统。
程序是伪完成一项特定任务而用某种语言编写的一组指令序列。
二.进制
进制就是进位制。比如我们平时使用的是十进制,逢十进一,9+2=11=9+1+1;我们生活中时间计算小时使用的二十四进制,二十四进一,二十四小时过了,就加一天。
1.二进制
计算机底层使用的就是二进制。二进制数据是用0和1两个数码来表示的数。它的基数是2,进位规则是“逢二进一”,借位规则是“借一当二”。
数据在计算中主要是以补码的形式存储的。
十进制整数转化二进制的方法:除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
十进制小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
注意:乘的时候只乘小数部分;0.432只有3位,故只需3位;0.432的二进制为:0.011。
2.八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。
八进制二进制相互转换
八进制一位对应二进制三位
十进制转换八进制的方法:
用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
3.十六进制
十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。
十六进制一位对应二进制四位
十进制转换十六进制的方法:
用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
4.C语言表示相应进制数
十进制 以正常数字1-9开头,如123
八进制 以数字0开头,如0123
十六进制 以0x开头,如0x123
二进制 C语言不能直接书写二进制数
案例:
#include
<stdio.h>
int
main()
{
int
a
= 123; //十进制方式赋值
int
b
= 0123; //八进制方式赋值,
以数字0开头
int
c
= 0xABC; //十六进制方式赋值
//如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
printf("十进制:%d\n",a
);
printf("八进制:%o\n",
b); //%o,为字母o,不是数字
printf("十六进制:%x\n",
c);
return
0;
}
三.计算机内存数值存储方式(原码、反码、补码)
整数的原码、反码、补码都一样。
1.原码
最高位为符号位,0代表正,为1代表负,数值部分就是数值本身绝对值的二进制数。
案例:
十进制数 原码
+15 0000 1111
-15 1000 1111
+ 0 0000 0000
- 0 1000 0000
2.反码(通常作为 求补码 中间过渡)
对于负数,符号位不变,其余位取反。
3.补码:在计算机系统中,数值一律使用补码存储。
对于负数,其补码为它的反码 +1
补码求原码:补码符号位不动,其他为求反,最后整个数+1,得到原码。
案例:
十进制数 原码
+15 0000 1111(正数原码、反码、补码一样)
-15 1000 1111
+ 0 0000 0000
- 0 1000 0000
4.补码的意义
(1) 补码统一了零的编码
案例:用8位二进制数分别表示+0 和 -0
用原码:
+ 0 0000 0000
- 0 1000 0000
用反码:
+ 0 0000 0000
- 0 1111 1111
用补码:
+ 0 0000 0000
- 0 10000 0000 (1进位丢失)
所以,补码统一了零的编码。
(2) 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
案例:计算9-6
原码计算:
补码计算:
(3)在计算机系统中,数值一律用补码来存储,主要原因是:
统一了零的编码
- 将符号位和其它位统一处理
- 将减法运算转变为加法运算
- 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃