(0x01)CPU组成
:
- 寄存器:(累加,标志【逻辑判断】, 基址【imagebase】,变址【基址寄存器的相对位置】,程序,计数【下一条指令在程序中的位置】,指令【cpu内部使用】,栈【记录栈的地址】 )
- 控制器(主要负责控制,控制每条指令的运行)
- 运算器(计算机中执行各种算术和逻辑运算操作的部件)
- 时钟(时钟频率与CPU的性能成正比)
程序与CPU:代码->EXE->加载->CPU
低级语言->机器语言->汇编->c++\java\python
乱码:是因为各种原因(主要是网络传播异常)导致代码或者数据变乱,如1234编程1324。
程序是什么?
为实现某种功能而用计算机语言编写的命令集合。
程序由什么组成?
算法,数据
什么是机器语言?
直接用二进制代码表示的语言,全是0和1。
运行中的程序储存在什么位置?
内存中。
什么是内存地址?
计算机为程序分配的内存空间的编号。
(系统RAM中的特定位置,通常以十六进制的数字表示,如同计算机内部特定位置的编号)
解释和运行程序指令的的计算机部件叫什么?
控制器。
32位是几个字节?
4字节
(0x02) 二进制的运算
为什么要引入反码与补码?
计算机只懂加法不懂减法,在做运算的时候要将减法转换成加上一个负数(负数->反码->补码)。
原码、补码与反码
正数的补码和反码都是其本身;
负数的反码是除了符号位其余位数取反,负数的补码是其反码再加1.
左移与右移
逻辑右移是不考虑符号位,算数右移是需要考虑符号位。
左移就是: 丢弃最高位,0补最低位
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变、
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。 当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。 当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
负数10100110 >>5(假设字长为8位),则得到的是 11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.
浮点数
:在计算的时候将其换成整数,在输出的时候再换成浮点数。
01011100对于的十进制是多少?
5C(H) -> 92
00001111左移两位结果是多少?由什么规律?
00111100,最左边去掉两位,右边补0
以补码形式表示的8位二进制数1111 1111,十进制为多少?
1111 1111的反码是:1000 0000,补码为:10000001
二进制和十进制有什么区别?
二进制全是0和1组成,十进制是由0~9十个数字组成。
0-16的二进制,再转换十进制
00000 (0),00001(1),00010(2),00011(3),00100(4),00101(5),00110(6),00111(7),01000(8),01001(9),01010(10),01011(11),01100(12),01101(13),01110(14),01111(15),10000(16)
计算:
0010011
+ 0010011
-------------
= 0100110
0011101
+ 0000011
--------------
= 0100000
0100111001
- 0001110000
--------------------
0011001001
0100111001-0001110000 ==0100111001+(-0001110000)==0100111001+(100001010)==011010000
1110011001000逻辑右移3位,算术右移3位(都用二进制表示)。
逻辑右移:0001110011001
算术右移:1111110011001