计算机系统基础
视频地址:https://www.bilibili.com/video/BV1ni4y1G7B9/
1、有符号数、无符号数
计算机是不懂正负的
假设整数在计算机中是占8位(实际上根据类型所占的位数是不同的,int是4字节32位)
无符号数在计算机中存储时,2进制表示是什么,这个数就是什么
0 0 0 0 0 0 0 1 # 十进制:1
有符号数在计算机中存储时,会把最高位当作符号位,1负0正
0 0 0 0 1 0 0 1 # 正数,最高位是0
1 0 0 0 1 0 0 1 # 负数,最高位是1
2、原码、反码、补码
原码反码补码实际上就是计算机的编码规则
原码:最高位是符号位,其余位置的2进制和就是该数的绝对值
# 1
0 0 0 0 0 0 0 1 # 最高位0代表是正数,其余7位的2进制和是1的绝对值
# -1
1 0 0 0 0 0 0 1 # 最高位1代表是负数,其余7位的2进制和是-1的绝对值
反码:
- 正数的反码与原码相同
- 负数的反码,最高位是符号位1,其余位对原码取反
# 1
0 0 0 0 0 0 0 1
# -1
1 1 1 1 1 1 1 0 # 最高位1代表是负数,其余7位对原码取反(0->1,1->0)
补码:
- 正数的补码和原码相同
- 负数的补码,最高位是符号位1,其余位是反码+1
# 1
0 0 0 0 0 0 0 1
# -1
1 1 1 1 1 1 1 1 # 最高位1代表是负数,其余7位变为反码+1
这样的一套编码规则是经过深思熟虑的,目的就是为了位运算!
3、位运算
与运算(and,&)
# 都为1则1,其余为0
1 0 0 0 1 1 1 1
0 1 1 1 0 0 0 1
---------------
0 0 0 0 0 0 0 1
或运算(or,|)
# 都为0则0,其余为1
1 0 0 0 1 1 1 1
0 1 1 0 1 0 0 0
---------------
1 1 1 0 1 1 1 1
异或运算(xor,^)
# 相同为0,不同为1
1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0
---------------
0 1 1 0 1 0 0 1
非运算(not,~)
# 取反(0->1,1->0)
1 0 1 1 0 0 0 1
---------------
0 1 0 0 1 1 1 0
左移(shl,<<)
# 实际上是*2
0000 0001 # 所有二进制位全部左移若干位,高位就丢弃了,低位补0
0000 0010
右移(shr,>>)
# 实际上是/2
0000 0010 # 所有二进制位全部右移若干位,低位就丢弃了,高位就需要补0,1(符号位决定。)
0000 0001
1000 0010 # -2的原码
1111 1101 # -2的反码
1111 1110 # -2的补码
1111 1110 # -2
1111 1111 # -1
负数在计算机中就是以补码的形式存在的!
原因是为了实现同一套运算规则!
4、位运算实现加减乘除
计算机是不懂加减乘除的
那么我们在高级语言中写的4+5,计算机是怎么算出来结果为9的呢?
4+5=?
0000 0100 # 4
0000 0101 # 5
--------- # (计算机是不懂加法的)
0000 1001 # 9
计算机中加法的实现原理!
# 第一步,异或!
0000 0100
0000 0101
---------
0000 0001
# (由于计算机是2进制计算的,而异或相同为0,不同为1恰好满足了0+0=0,1+1=10),如果不考虑进位,异或运算就是最后的结果!
# 第二步,与运算(判断进位,如果与运算结果为0,那么上一步异或的结果就是最后的结果)
0000 0100
0000 0101
---------
0000 0100
# 结果不为0说明有进位
# 第三步,将与运算的结果左移1位
0000 1000
# 第四步,异或!
0000 0001
0000 1000
---------
0000 1001
# 第五步,与运算
0000 0001
0000 1000
---------
0000 0000 # 结果为0,上一个异或的结果就是最终答案!
0000 1001 0x09 9
4-5=?
减法实际上就是特殊的加法!
# 第一步,异或!
0000 0100
1111 1011
---------
1111 1111
# 第二步,与运算
0000 0100
1111 1011
---------
0000 0000 # 结果为0,说明上一个异或的结果就是最终答案!
1111 1111 0xFF -1
乘:x*y, 就是 y 个 x 相加,还是加法 。
除:x/y, 本质就是减法,就是X 能减去多少个Y。
5、寄存器
现在的电脑几乎都是64位的,64位与32位相比寻址能力有了极大的提升,但底层架构并没有非常大的改动,因此依然可以学习32位
32位电脑有8个通用寄存器,可存的范围为0~FFFFFFFF
32位 16位 8位
EAX AX AL AH
EBX BX BL BH
ECX CX CL CH
EDX DX DL DH
ESP SP
EBP BP
ESI SI
EDI DI
# EAX
0000 0000 0000 0000 0000 0000 0000 0000
# AX
0000 0000 0000 0000
# AL
L是low的意思,是AX中的低8位
H是High的意思,是AX中的高8位
# 向寄存器存值
mov eax,1
mov ebx,eax
除通用寄存器外,电脑中还有一些有特殊用法的寄存器
6、内存
寄存器的数量是比较少的,不够用,数据放到内存!
如果学习了操作系统会对内存有更清晰的了解,程序在运行时并不是所有数据都在内存的,是当前正在访问的那部分数据在内存,如果要访问不在内存的部分,处理器会根据调度算法将需要的部分放入内存。
理解32位的电脑内存最多4GB?
1B = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
4G的内存,最后换算成位是一个很大的数字!
4*1024*1024*1024*8 = 34359738368位
计算机的每一块内存地址都是有编号的,32位电脑的内存地址编号最大也是32位!
实际上寄存器中有一个叫做寻址寄存器,32位,而每一个内存地址对应一个字节的数据,也就是8位
2^32*8 = 2^35 = 34359738368位
所以1台32位的电脑,即使内存扩到了8G,由于4G之后的内存地址无法编址,也就无法访问和使用,所以说32位的电脑内存最多4G。