第一周、计算机系统概述
摸鱼了!!!
第二周、数据的表示和存储
第一讲 数制和编码
1、信息的二进制编码
机器级数据分两大类
- 数值数据:无符号整数、带符号整数、浮点数(实数)
- 非数值数据:逻辑数(包括位串)、西文字符和汉字
计算机内部所有信息都用二进制(即:0和1)进行编码
用二进制编码的原因
- 制造二个稳定态的物理器件容易(电位高/低,脉冲有/无,正/负极)
- 二进制编码、计数、运算规则简单
- 正好与逻辑命题真/假对应,便于逻辑运算
- 可方便地用逻辑电路实现算术运算
真值和机器数( 非常重要的概念!)
- 机器数:用0和1编码的计算机内部的0/1序列
- 真值:真正的值,即:现实中带正负号的数
**例:**unsigned short型变量x的真值是127,其机器数是多少?
127=27-1,其机器数为0000 0000 0111 1111
2、数值数据的表示
数值数据表示的三要素
- 进位计数制 (二进制、八进制、十进制、十六进制)
- 定、浮点表示 (定点表示、浮点表示)
- 如何用二进制编码(原码、补码或者移码)
**即:**要确定一个数值数据的值必须先确定这三个要素。
进位计数制
- 十进制、二进制、十六进制、八进制数及其相互转换
定/浮点表示(解决小数点问题)
- 定点整数、定点小数
- 浮点数(可用一个定点小数和一个定点整数来表示)
定点数的编码(解决正负号问题)
- 原码、补码、反码、移码 (反码很少用)
3、十进制(Decimal)计数制
十进制用0、1、2、3、4、5、6、7、8、9来表示。“10”称为基数(base),它代表每个数位上可以使用的不同数字符号个数(也就是有0~9个符号可以使用)。10^i称为第i位上的权。运算时, “逢十进一”。
4、二进制(Binary)计数制
与十进制类似;
5、R进位计数制
与十进制类似;
6、八进制和十六进制
**问:**为什么还要引入 八进制 / 十六进制呢?
**答:**因为二进制太长了,不方便阅读。
**八进制:**Octal (用后缀“O”表示)
**十六进制:**Hexadecimal (用后缀“H”,或前缀“0x”表示)
7、十进制数与R进制数之间的转换
(1) R进制数 => 十进制数
按照权值展开;
(2) 十进制数=>R进制数
整数–****–“除基取余,上右下左”
小数----“乘基取整,上左下右”
PS:小数点在计算机中怎么表达?
8、定点数和浮点数
计算机中只有0和1,数值数据中的小数点怎么表示呢?
- 计算机中只能通过约定小数点的位置来表示。
- 小数点位置约定在固定位置的数称为定点数
- 小数点位置约定为可浮动的数称为浮点数
**定点小数:用来表示浮点数的尾数部分
定点整数:用来表示整数,分带符号整数和无符号整数
任何实数:X=(-1)S×M×RE **(类似于科学计数法)
-
s s s 表示符号位,取值为 0 0 0 或 1 1 1,用于表示数的正负。
-
M M M 表示尾数(或有效数字),是一个二进制小数,可以看做是一个带符号的定点数,其值在 1 1 1 (包括)和 2 2 2 (不包括)之间。
-
R R R 表示基数,通常是 2 2 2。
-
E E E 表示指数,是一个整数,用于表示浮点数需要乘以多少个基数才能得到原数,其取值范围会根据具体的浮点数格式而不同。
-
S取值为0或1,用来决定数X的符号;
-
M是一个二进制定点小数,称为数X的尾数(mantissa);
-
E是一个二进制定点整数,称为数X的阶或指数(exponent);
-
R是基数(radix、base),可以为2、4和16等。 计算机中只要表示S、M和E三个信息,就能确定X的值,这称为浮点数
第二讲 定点数的编码表示
1、原码
原码可以说是所有编码的根源
原码是一种表示有符号整数的二进制编码方式,其特点是用二进制数的最高位表示符号,0 表示正数,1 表示负数,其它位则表示数值的绝对值。例如,一个 8 位的二进制数,其最高位为符号位,范围为 -2^7 到 2^7-1。比如,数字 3 的原码是 00000011,-3 的原码是 10000011。
原码表示法相对简单和直观,但存在一些问题。例如,在进行加减运算时,需要额外处理符号位;而且整数的取值范围不对称,正数和负数的取值范围不一样,分别为 0~2^{n-1}-1和 -2^{n-1}~-1(其中 n n n 是表示整数使用的二进制位数)。因此,在实际应用中,更多采用补码、反码等方式来表示有符号整数,这种编码方式能够解决原码存在的一些问题。
2、补码
使用补码代替原码可以统一加减法
00102+00102=01002 (2+2=4)
00102+11102=00002 (2+(-2)=0)
模运算:
比如始终就是一个模12系统:
6点是时针指向 6、18点是时针指向 6(18mod12)
负数的模运算:比如-4,-4=12-(|-4|)=8 ,8就是-4"补码"
10 - 4 => 10+(4的补码)=18(但是18要mod12 才是答案,即6)
假定机器数有n位,n=3
真值的范围是-2^n-1 ~ (2^n-1)-1
[X]补= 2^n+ X (-2n-1≤X<2n-1,mod 2^n)
例如:X=-4
[X]补=2^n+X=8-4=4 ,查表发现4和-4用的是同一个二进制数
无符号数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | |
真值 | 0 | 1 | 2 | 3 | -4 | -3 | -2 | -1 |
负数在计算机中以补码的形式存储,正数在计算机中以原码的形式存储。
正数的补码
- 正数的原码、补码、反码、相同;
负数求补码
负数如何求补码?分为如下步骤:
- 首先求出负数的原码,如-8的原码为 1000 1000,
- 通过原码求出它的反码,负数的反码就是 除符号为以外,其余的全部求反,如-8 反码为 1111 0111,
- 负数的反码 +1,就是它的补码,如 -8 的补码为 1111 1000
_ _一个负数的补码等于将对应正数补码各位取反、末位加一
特殊为的补码:
假定机器数有n位
① [-2n-1]补= 2^n- 2^(n-1)= 10…0(n-1个0) (mod 2n)
② [-1]补= 2n- 0…01 = 11…1(n个1)(mod 2n)
③ [+0]补= [-0]补= 00…0(n个0
3、变形补码(4’s comlement)的表示
4、求补码的真值
5、移码表示Excess (biased) notion
原码 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
编码 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
移码 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
补码 | 0 | 1 | 2 | 3 | -4 | -3 | -2 | -1 |
问:所以为什么用移码来表示解码????
答:浮点数进行加减运算时,要先比较阶码是否一致,如果一致在对尾数进行操作,如果不一致就要进行大小比较,把阶码小的变大。在进行比较时,如果使用原码(也就是有符号数)来表示阶码会比较麻烦,因为需要判断符号;如果使用移码,就可以把他们当成无符号数进行比较,比较方便,因为不需要判断符号。
第三讲 C语言中的整数
要点:整数以补码的形式存储,但是解释的方式不同,同一个01序列表的意思也就不同
举例:-1<0u (表达式里面有一个无符号数一个有符号数,计算机会把他们两个当成无符号数进行比较)
-1: 1111 1111 1111 1111 1111 1111 1111 1111 这个01序列看成无符号数结果就是最大无符号整数
0: 0000 0000 0000 0000 0000 0000 0000 0000 这个01序列看成无符号数结果依旧0
所以比较的结果为false
第四讲、浮点数的编码表示
1、科学计数法与浮点数
不用怀疑,浮点数就是以2为基数的科学计数法;
2、浮点数(Floating Point)的表示范围
3、IEEE 754标准(浮点数的表示)
4、浮点数转换为真值
5、真值转浮点数
1.75的浮点数举例:
要表示1.75的浮点数,我们需要使用特定的浮点数表示规范。常见的浮点数表示规范包括IEEE 754单精度(32位)和双精度(64位)标准。
在IEEE 754单精度浮点数标准中,浮点数由三个部分组成:符号位(1位),指数部分(8位),和尾数部分(23位)。其中,指数部分用于指定10进制小数点的位置,尾数部分存储小数的二进制表示。
将1.75表示为IEEE 754单精度浮点数,以下是该数的表示过程:
符号位(S):正数,S为0。
整数部分和小数部分的二进制表示:
1.75 = 1.11(二进制)
根据IEEE 754单精度浮点数规范,我们需要将1.11标准化为科学计数法表示形式:1.11 * 2^0。
指数部分(E):0(由于标准化,小数点在第一位,因此指数为0)。
尾数部分(M):尾数部分是小数部分去掉整数部分的二进制表示,即0.11。
将这些部分组合起来,得到1.75的IEEE 754单精度浮点数表示为:
符号位(S):0
指数部分(E):0(以偏移值127表示,实际指数为0 + 127 = 127)
尾数部分(M):11000000000000000000000(尾数部分补齐到23位)
组合起来:0 01111111 11000000000000000000000
请注意,以上表示是基于IEEE 754单精度浮点数标准。其他浮点数标准可能会有不同的表示形式。
6、0的机器数表示
7、+∞/-∞的机器数表示
8、“非数”的表示
9、非规格化数(Denorms)的表示
10、关于浮点数精度的一个例子
第五讲、非数值数据的编码表示
第六讲、数据宽度和存储容量的单位
第七讲、数据存储时的字节排列
第三周、数字逻辑电路基础
第一讲、数字逻辑电路基础
1、布尔代数
第二讲、C表达式到逻辑电路
第三讲、C语言中的各类运算
1、C语言程序中涉及的运算
**问:**如何从数据y中提取低位字节,并使高字节为0?
答:……
2、C语言程序中涉及的运算
PS : 对数值操作时可能会造成数据丢失**!!!**
#include<stdio.h>
int main()
{
//有符号数 左移时低位补0,右移动时看符号位,看原来的符号位,符号位是啥就补啥!
int a = 0x7fffffff;//01111111 11111111 11111111 11111111
int a1 = a << 1; //11111111 11111111 11111111 11111110 fffffffe
int a2 = a >> 1; //00111111 11111111 11111111 11111111 3fffffff
printf("a1=%0xd a2=%0xd\n", a1, a2);
int b = 0x8fffffff; //10001111 11111111 11111111 11111111
int b1 = b << 1; //00011111 11111111 11111111 11111110 1ffffffe
int b2 = b >> 1; //11000111 11111111 11111111 11111111 c7ffffff
printf("b1=%0xd b1=%0xd\n", b1, b2);
//无符号整数 逻辑移位 和 算数移位 的结果一致:(因为逻辑移位无论是左移还是右移,补的都是0,无符号的算术位移,因为)
unsigned int c = 0x7fffffff;//01111111 11111111 11111111 11111111 右移高位补0
printf("c=%0xd\n", c >> 1); //00111111 11111111 11111111 11111111 3f ff ff ff
unsigned int d = 0x7fffffff;//01111111 11111111 11111111 11111111 左移低位补0
printf("d=%0xd\n", d << 1); //11111111 11111111 11111111 11111110 ff ff ff fe
}
第四讲、整式加减运算
第四周、整出运算及浮点数运算
第一讲、整数乘法运算
**问:**对于C语言程序中的表达式z=xy,其中x,y和z都是32位的int型整数,z的取值为xy的64位乘积中的低32位。
答:正确!!!
第二讲、整数除法运算
第三讲、浮点数运算
第五周、IA-32指令系统概述
第一讲、程序转换概述
第二讲、IA-32指令系统概述
test.c 预处理得到test.i
test.i编译得到汇编代码test.c
通过汇编命令gcc -c test.s -o test.o生成可重定位的目标代码,test.o是一个二进制文件(机器指令表示的文件),想要看这个文件需要对其进行反汇编 objdump -d test.o
C 语言是一种高级编程语言,它使用人类可读的语法和结构来编写程序。但计算机不能直接理解 C 语言代码,需要将其编译成机器指令才能在计算机上运行。
编译器是将 C 语言代码转换为机器指令的软件。编译器将源代码分析、优化和翻译为汇编代码,然后将汇编代码转换为机器代码。机器代码是计算机可以直接执行的二进制代码。
下面是将 C 语言程序编译为机器指令的大致步骤:
- _ 预处理:编译器首先对源代码文件进行预处理,去掉注释、处理 #include 等预处理指令,并展开宏定义等。 _
- _ 编译:编译器将预处理后的 C 语言代码编译成汇编代码,生成一个汇编语言文件(通常以 .s 扩展名保存)。 _
- _ 汇编:汇编器将汇编代码翻译为机器指令,生成一个可重定位目标文件(通常以 .o 或 .obj 扩展名保存)。 _
- _ 链接:链接器将目标文件与库文件等进行链接,生成一个可执行文件(通常以 .exe 或没有扩展名保存)。 _
这样就完成了从 C 语言源代码到可执行文件的编译过程。最终生成的可执行文件包含机器指令和其他系统信息,可以在操作系统上运行并执行程序。