电子说
01数值表示:
在计算机系统中,要表示一个数,原则上我们可以使用任意进制来描述,但在实际应用中一般用二进制、八进制、十进制、十六进制来表示一个数。
二进制表示一个数只能用0、1两个数字来表示,比如10011(十进制是19);
八进制表示一个数只能用0~7八个数字来表示,比如017(十进制是15). 八进制通常以0开头,用来区分十进制;
十进制表示一个数只能用0~9十个数字来表示,这是平时经常用的,比如100
十六进制表示一个数只能用09,AF这16个数字来表示,其中A~F换成10进制就是10-15,十六进制通常以0x开头,用来区分十进制。比如0x1f(十进制是31)
通过上面的介绍,我们也可以看出,N进制表示一个数,可以用0~N之间的N个数字来表示,N进制表示的数,转换成十进制的方法如下:
数字的值*N((数字所在位置-1)次方)
比如六进制表示一个数125,那么如何算这个数的十进制表示的值呢?换算方法如下:
1(6的2次方)+2*(6的一次方)+5*(6的0次方) = 53
02
进制转换
上面介绍了一个数值如何用进制来表示,对同一个数值而言,可以用多种进制来表示,进制之间可以相互转换。在实际应用中,N进制换算成M进制,我们一般会先从N进制换算到十进制,再从十进制换算到M进制。下面我们通过一些例子来说明进制之间如何转换。
01
十进制转二进制
把该十进制数,用二因式分解,取余。
以235为例,转为二进制
235除以2得117,余1
117除以2得58,余1
58除以2得29,余0
29除以2得14,余1
14除以2得7,余0
7除以2得3,余1
3除以2得1,余1
从得到的1开始写起,余数倒排,加在它后面,就可得11101011。
02
**十进制转八进制
**
把该十进制数,用8因式分解,取余。
以100为例,转为八进制
100除以8得12,余4
12除以8得1,余4
1除以8得0,余1
转成八进制就是0144
03
**二进制转十进制
**
二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方。
以二进制数10101为例
03
小数的表示方法
一个数会包含整数部分和小数部分,上面章节已经讲述了整数部分如何表示,本小结介绍一下小数部分是如何表示的。
从上面可以看到,小数部分就是2的负幂次方多项式构成,因此小数的数值用二进制表示就是从高到底依次为A-1A-2A-3A-4….
用多项式描述一个数,可以看到存在一个问题就是小数部分存在无法精确表示的问题,比如0.6 这个小数数值,如果用二进制的话,2的负幂次方多项式只能无限接近,但无法等于0.6。
十进制的小数数值用二进制来表示方法:
将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,知道小数部分为0。举例如下:
十进制0.4转成二进制:
0.4 * 2 = 0.8 整数部分是0
0.8 * 2 = 1.6 整数部分是1
0.6 * 2 = 1.2 整数部分是1
0.2 * 2 = 0.4 整数部分是 0
可以看到进入循环了,因此0.4的二进制表示为0110 0110 0110 …..
二进制小数转成十进制方法:
按位乘以权重,然后相加。二进制小数点后第1位乘以2^(-1),第2位乘以2^(-2)
以此类推,然后相加即可
**例如:0.101——>12^(-1)+02^(-2)+1*2^(-3)=0.5+0+0.125=0.625**
十进制小数数值转成其他进制也是类似的,所有的原理都是一个实数可以用一个多项式来表示,正数次幂部分代表的是整数部分,负数次幂部分代表的是小数部分。
04
有符号数和无符号数
从底层硬件来讲,存储的都是0/1这样的状态,本是是没有有符号和无符号之分的。但计算机应用时,根据描述现实世界的需求,可以在软件中指定这个变量是有符号变量还是无符号变量,从而这个变量的数值是有符号数值还是无符号数值。因此这两个定义其实是计算机应用的范畴。
有符号和无符号数,简单的区别就是,无符号数所有的位都是用来表示一个数,有符号数最高位用来表示符号位,其他位用来表示实际的数值。对于某一个具体的数值,不管是有符号表示还是无符号表示,它的二进制表示都是一样的。
在8位机的系统中,地址和数据总线是8bit的,无符号变量表示的值的范围是0255,有符号变量表示的值的范围是-128127
另外还有一点,如果一个数值声明为有符号数,那么最高位是bit位,这是按照二进制表示这个数值之后的最高位,其实在计算系统里面,比如有8位机,16位机,32位机,64位机,一个数的最大位宽也就上面对应的bit数, 如果某个数标识为有符号数,那么对应第7bit, 15bit,31bit,63bit就是符号位。
05
原码反码补码
这三个概念其实都是对有符号数来讲的,无符号数不存在上面这些概念。
这些概念都是为了在计算机系统中描述一个负数而创建的,通过这些概念扩展二进制数字系统,从而可以表示有符号数。
正数的原码、反码、补码都是一样的。
负数的原码就是符号位为1,其余位表示真值,举例如下(8位机):
-2的原码就是1000_0010(高位符号位为1,其余位是2)
负数的反码其实是在原码的基础上, 符号位不变,其余各个位取反,举例如下(8位机):
-2的反码就是1111_1101(在-2的原码上,符号位不变,其他位取反)
负数的补码是反码+1,举例如下(8位机):
-2的补码就是1111_1110(在-2的反码上加1)
所以我们这里讲这三个概念,有一个大前提就是,要明确好当前这个系统是多少bit的系统,这样才能确定符号位是哪bit。
全部0条评论
快来发表一下你的评论吧 !