进制数&寄存器&内存
机器语言、汇编语言和高级语言
机器语言:计算机执行的二进制命令0和1。
汇编语言:用助记符代替机器指令的操作码(如:ADD表示加法)
高级语言:符合人们的习惯,也更容易理解和修改。高级语言经过编译器编译之后可以得到目标程序。(如:C++、JAVA)
进制的思想本质
二进制:0 1
三进制:0 1 2
四进制:0 1 2 3
八进制:0 1 2 3 4 5 6 7
十进制:0 1 2 3 4 5 6 7 8 9
十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f
测试-进制数是有规律的
进制的运算
数据宽度
数据类型 | 占用字节 | 取值范围 |
bit | 【0 1】 | |
byte=unsigned char | 1个字节 | 【0 0xff】(备注:0xff=15*16^0+15*16^1=2^8-1=255) |
word=unsigned short | 2个字节 | 【0-0xffff】(备注:0xffff=15*16^0+15*16^1+15*16^2+15*16^3=2^16-1=65,535) |
dword=unsigned long | 4个字节 | 【0-0xffffffff】(备注:0xffffffff==2^32-1=4,294,967,295。-1是因为从0开始的) |
无符号数和有符号数
无符号数只有正数,没有负数。而有符号数,因为要兼容负数的可能性,就要牺牲一个最高代位表示正负号(0正数,1负数)。
用char来举例吧,char占一个字节,一个字节=8个二进制位,有符号和无符号的数值对比如下:
有符号: 0111 1111 = 2^6+2^5+2^4+2^3+2^2+2^1+2^0 =2^7-1= 127 取值范围是【-128 ~ 127】 无符号: 1111 1111 = 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0 =2^8-1= 255 取值范围是【0 ~ 255】
源码、补码和反码
负数的反码是对原码按位取反,符号位一定是1;补码是反码加1,符号位一定是1。
位运算
与&
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
或|
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
异或^
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
取反~
每个位上都取相反值,1变成0,0变成1。
1011 0001
--------------------------------
0100 1110
位运算
左移(shl <<)
1<<7 = 1*2^7 = 128
2<<3 = 1*2^3 = 8
3<<2 = 3 * 2^2 = 12
0000 0001 1
0000 0010 2 移动1位
0000 0100 4 移动2位
0000 1000 8 移动3位
0001 0000 16 移动4位
0010 0000 32 移动5位
0100 0000 64 移动6位
1000 0000 128 移动7位
右移(shr >>)
100>>2 = 100/2^2 = 25
64>>3 = 64/2^3 = 8
进制转换
二进制 | 十六进制 | 十进制 | 八进制 |
1001 1010 |
1010=1*2^1+1*2^3=10=a 1001=1*2^0+1*2^3=9 0x9a |
1*2^1+1*2^3+1*2^4+1*2^7=154 |
010=1*2^1=2 011=1*2^0+1*2^1=3 10=1*2^1=2 232 |
八进制三位一组;十六进制四位一组。
十六进制转十进制:0x9a=10*16^0+9*16^1=154。
十进制转十六进制:154=0x9a
八进制转十六进制:八进制转二进制,二进制再转十六进制。
八进制转十进制:232=2*8^0+3*8^1+2*8^2=154。
十进制转八进制:154 = 232
java代码编写进制前缀
二进制:0b
八进制:0
十进制:无
十六进制:0x
寄存器
EAX、ECX、EDX、EBX为数据寄存器;
ESP、EBP为指针寄存器;
ESI、EDI变址寄存器。
内存
每个应用程序进程都有4GB的内存空间(虚拟内存)
32位的cpu的寻址能力到底是4GB
1、寻址最大值:ffff ffff + 1 = 1 0000 0000(字节b)
2、1 0000 0000 * 8 = 8 0000 0000(位bit)
3、
1B(byte,字节)= 8 bit
1KB(Kilobyte,千字节)=1024B
1MB(Megabyte,兆字节,百万字节,简称“兆”)=1024KB
1GB(Gigabyte,吉字节,十亿字节,又称“千兆”)=1024MB
64位的cpu的寻址能力
ffff ffff ffff ffff +1 = 2^64 = 18,446,744,073,709,551,616(字节b)=128GB
内存地址的写法
mov 数据宽度 内存地址 存的值
