程序员不得不理解的计算机进制转换
最近在备考软考的软件设计师考试,学到了对于计算机的数据表示,因为我是科班出身学的Java,导致计算机基础知识很差,在这里记录一下学习感触
为啥要用二进制
- 晚期计算机的存储介质是晶体管,晶体管依据电压不同,只能示意2种状态,也就是0和1
- 计算机应用二进制运算更加不便
更具体的请参考计算机为啥采纳二进制
为啥要用十六进制
首先,如果你的计算机是32位的机器,数字1在计算机中的示意就是0000000000000000001,
如果你是要操作内存,用这么长一串二进制数,是不是感觉有拍板大,1位16进制数能够示意4位二进制数,
那数字1用16进制来示意就是1H,是不是感觉清新多了。
进制转换的原理
浏览本章之前须要明确的点
- 进制数的位数从右到左,别离示意从高到低,咱们称左边的数为高位,右边的数为低位
- 一位八进制数最多示意三位二进制数,一位十六进制数最多示意4位二进制数
十进制转二进制、八进制、十六进制
对于10进制转其余进制,个别是应用除法取余数的形式进行计算
例如将数字151 转换为二进制
被除数 ÷ 除数 = 商 ... 余数151 ÷ 2 = 75 ... 1 75 ÷ 2 = 37 ... 1 37 ÷ 2 = 18 ... 1 18 ÷ 2 = 9 ... 0 9 ÷ 2 = 4 ... 14 ÷ 2 = 2 ... 0 2 ÷ 2 = 1 ... 0 1 ÷ 2 = 0 ... 1将每一步失去的余数从下往上顺次排列,失去 10010111,即151的二进制示意。
转为八进制
151 ÷ 8 = 18 ... 718 ÷ 8 = 2 ... 22 ÷ 8 = 0 ... 2151的8进制示意为227
转为十六进制
151 ÷ 16 = 9 ... 7 9 ÷ 16 = 0 ... 9因而,151的16进制数为97
二进制、八进制、十六进制转十进制
对于其余进制转换为10进制,咱们个别是采纳按权开展法,并且具备公式
- r 为进制单位 如果数字为二进制 则r = 2
- n 为数字的位数, 例如有一个二进制数 1001,则它的n为4
- $a_{n}$ 示意取数字的第几位 如果有一个二进制数1001, 那么$a_{n}$ 就为1
例如: 十进制数11的二进制数为1011
应用按权开展法,首先该二进制数有4位,所以n为4,能够得出以下式子
对于八进制,十六进制都是应用该办法转换为10进制
二进制、八进制、十六进制之间相互转换
将二进制数转换为八进制数,须要先将二进制数转换为10进制,而后将10进制数转换为八进制
这种转换形式有点麻烦,如果不是很大的数字,能够看下一章,疾速转换
疾速转换进制的办法
疾速转换能够通过查表的形式疾速转换
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | - | 8 |
9 | 1001 | - | 9 |
10 | 1010 | - | A |
11 | 1011 | - | B |
12 | 1100 | - | C |
13 | 1101 | - | D |
14 | 1110 | - | E |
15 | 1111 | - | F |
在这个表格中,每个进制的数字都有对应的二进制、八进制、十进制、十六进制数。例如,十进制数2对应二进制数10,八进制数2和十六进制数2都是用数字2来示意,十六进制数F对应二进制数1111。应用这个表格能够疾速地进行不同进制之间的转换。
这种形式对于二进制、八进制、十六进制之间的转换十分无效
例如 将二进制数10101转换为十六进制
- 首先一个十六进制数最多示意4位进制数
- 从低位取4位二进制数 0101 在16进制下没有发现该数字,将高位的0去掉 失去 101,查到16进制数5
- 持续从低位再取4位,发现只有1了,那它的16进制数就是1
- 从低位到高位组合16进制数 失去 15
进制加减法
还记得小学咱们学的十进制加减法不,即满十进一法.
其实对于二进制,八进制,16进制数可别离对应满二进一,满八进一,满16进一.
请参考 16进制加减法
二进制计算符号位溢出问题
学习该章首先要明确的点
- 计算机中的位,示意的是CPU的寻址空间大小
- 计算机中二进制(原码)数字的首位为符号位,0示意负数,1示意正数
- 这里也能够了解为数字示意的最大二进制位数
首先如果咱们在一个字长为8位的计算机中进行运算 5 + 7
将它们转换为2进制运算 00000101 + 00000111 = 00001100
00001100 = 12
那如果是 -5 + -7 呢
转换为二进制运算就是,10000101 + 10000111 = 100001100
100001100 计算出来的二进制数变成了9位,8位下的计算计算机咋能示意9位呢,那把首位的1去掉就变成了00001100 = 12
额,为啥 两个正数相加咋变成负数了,计算机是不是傻了。咱们下节持续