数制与数制转换
![81b5852d56473edb90e0cbd4914a29c1.png](https://i-blog.csdnimg.cn/blog_migrate/3907a30756d7fe4ec7e7bf14c0d0557c.jpeg)
数制是用一组固定的符号和统一的规则来表示数值的方法。
在数值计算中,一般采用进位计数制:用进位的方法进行计数。
在日常生活中,人们习惯使用十进制。而在数字系统中常采用二进制。
为了阅读与书写的方便,在数字系统中还使用八进制和十六进制。
在进位计数制中,数的表示涉及两个基本问题:基数与权。
下面首先看一下我们最熟悉的数制:十进制。
一、数制
1.十进制
十进制是我们每天都在使用的一种数制,它具有如下特点:
- 十进制采用十个计数符号:0,1,2,3,4,5,6,7,8,9
- 十进制采用逢十进一的进位规则。(由于十进制采用十个计数符号和逢十进一的进位规则,因此十进制的基数为10)
- 十进制采用位置计数法。即同一个符号在不同的位置时,它所代表的数值是不同的。 如下图,其中整数部分第四位的"1"代表的数值为1000,第二位的"1"代表的数值为10。
![01065ba4ab804aeb46c460a0ad4152a7.png](https://i-blog.csdnimg.cn/blog_migrate/99342e419ab3f11f6952db06bcb6cca2.png)
我们为十进制数中的每一个计数符号位分配一个权,权为基数10的整数次幂。整数的权为10的正次幂,从10的零次方开始,从右向左递增;小数的权为10的负次幂,从10的-1次方开始,从左向右递减。 则任何一个十进制数D,可以表示为加权系数之和。
![a9713b056c6a68ddde2955a20757fb20.png](https://i-blog.csdnimg.cn/blog_migrate/0dd783699fdecb5602e0e66c259a6196.jpeg)
其中,n为整数位个数,m为小数位个数,di为第i位的计数符号,称之为系数(上面这个臭臭公式可以不看,ta太抽象了)。
2.二进制
下面我们来看二进制。
- 二进制有两个计数符号:0,1
- 进位规则为逢二进一,因此基数为2.
- 与十进制一样,二进制采用位置计数法。 如下图,不同位置的"1"代表的值是不同的。从左到右四个1分别代表2的2次方,2的0次方,2的-1次方和2的-2次方。
![8c8ce51e5ac447544510fc0e3e80381c.png](https://i-blog.csdnimg.cn/blog_migrate/d3ac11f6d3e95c74e2a231e2938953a7.png)
我们为二进制数中的每一个计数符号位分配一个权,权为基数2的整数次幂。整数的权为2的正次幂,从2的0次方开始,从右向左递增;小数的权为2的负次幂,从2的-1次方开始,从左向右递减。 则任何一个十进制数B,可以表示为加权系数之和。
![66d34e2c31f816299572874e768532af.png](https://i-blog.csdnimg.cn/blog_migrate/bd631bf1f8a883da7691e37237ff8be8.jpeg)
其中,n为整数位个数,m为小数位个数,bi为第i位的计数符号,称之为系数(上面这个臭臭公式可以不看,ta太抽象了)。
3.十六进制
和前面两个数制类似,我就直接盗图了。
![866235a2beb46adc117ad1d4e8ced53a.png](https://i-blog.csdnimg.cn/blog_migrate/e2ed042f1da3a148e690744ad449e204.jpeg)
4.八进制
![d915df33fee04685afa4d1a76f02a249.png](https://i-blog.csdnimg.cn/blog_migrate/d7c127775d5d1899453c083fd00ed551.jpeg)
二、数制转换
前面我们介绍了几种数制,它们之间可以互相转换。
下面介绍二进制数和十进制数之间的转换。
我们知道,二进制数可以表示为加权系数之和,因此把加权系数之和的表达式展开,然后按照十进制数运算规则进行运算,就可以求得等值的十进制数。例如下图所示,
![8daa5420bb824265942ee4b64c0c78b6.png](https://i-blog.csdnimg.cn/blog_migrate/94c725c2f93c0e36f41b1dec1bbb9a98.jpeg)
另外还有基数连乘、连除法,实现二进制数到十进制数的转换,此处不作介绍。
反过来怎样把十进制数转换为二进制数呢?
第一种方法叫做提取2的幂法,它是刚刚讲过的,用按权展开法把二进制数转换为十进制数运算过程的逆过程。也就是将十进制数分解为加权系数之和。
![0bb59d6b0793cd89453b41f28aa501d1.png](https://i-blog.csdnimg.cn/blog_migrate/1439e10a0bb526e2aaa920e40ebde605.jpeg)
第二种方法是基数连乘、连除法。
十进制数的整数部分采用连除法,即,把十进制整数连续除以2,直到商等于零,然后 把每次所得余数按相反次序排列,就可以得到等值的二进制数。例如下图所示。
![09423b2a8dc08e89480ed3bf192b54d5.png](https://i-blog.csdnimg.cn/blog_migrate/1bb17c2f714e79eb692cc23daee389d4.jpeg)
十进制数的小数部分采用连乘法,即,把十进制小数连续乘以2,直到小数部分等于零或者达到规定的位数。然后把每次所得整数按序排列,就可以得到等值的十进制数。例如下图所示。
![c3ee5fd9464eeba48398b001bd771929.png](https://i-blog.csdnimg.cn/blog_migrate/877b8413b44f96a8a90d4a15ef134bc1.jpeg)
需要注意的是,不是每一个十进制小数连续乘以2,最后都可以导致小数部分等于0,此时应该采用等精度的有效位数表示方法。
可以推导,一个m位的十进制小数,需要(3m+1)位二进制小数才能保持等精度。(我也不知道啦,先背过再说)。例如十进制数0.37,需要7位二进制数0.0101111来表示。
数制与转换部分就到这里结束了。
参考视频链接:第一单元 数字逻辑基础-第一讲 数制-视频1
顺便放一个用C语言来实现求补码的文章-[关于求负数补码](关于求负数补码 - 剑冢、 - 博客园)