机器数和真值的概念: 机器数:一个数在计算机中的二进制表示形式; 真值:带符号位的机器数对应的真正数值(十进制的数)称为真值; 原码:符号位+真值的绝对值(二进制); |
|
原码的例子???——》 [ +1 ] = 0 0000001,[ -1 ] = 1 0000001; 注意:
|
反码的例子???——》 [ +1 ] = 0 0000001,[ -1 ] = 1 1111110; 注意: 正数???——》反码与原码相同,负数的反码则是其绝对值按位求反; 负数???——》反码是在其原码的基础上,符号位不变,其余各个位取反; 【例子】 在这里,我提示下各位,要看出反码的十进制数值,就要把它还原会原码才可以计算得出; |
补码的例子: [ +1 ] = 1 0000001;[ -1 ] = 0 1111111; 注意: 1、正数的补码与其原码和反码相同,负数的补码则等于其反码的末位加1;(特例:[ +0 ] = 0 0000000;[ -0 ] = 0 0000000) 2、负数的补码也就是在其原码的基础上,符号位不变,其余各位取反(0:正,1:负),最后+1; 【例子】 |
【软考知识】 1、最适合进行数字加减运算的数字编码是补码;???——》CPU只设置硬件加法器;???——》只有补码能够将减法转化为加法; 2、最合适表示浮点数阶码的数字编码是移码;???——》被广泛用来表示浮点数阶码的数字编码;???——》用比较阶码的大小来实现真值大小的比较; |
对原码、反码、补码的使用进一步的了解???——》
一般我们对加减乘除运算从小学开始学会后,就一直以为计算就该这么算;但是你要知道,计算机不是人,它只会逻辑;所以加减乘除这相对人类而言是最基础的运算,但对计算机而言,因为计算机只会辨认"符号位(正负)",所以用二进制来表示加、减这两种运算方式,会使计算机的基础电路设计变得十分复杂;于是人们就想出了将符号位也参与运算的方式;首先我们都知道:1-1=0,但是我们很少会这么写:1+(-1)=0;但是这样机器运算就可以只有加法而没有了减法,从而机器数的运算方式设计变得简单啦!
现在就来个原码栗子吧!让大家了解的更深刻一点哈!
唉!怎么1+(-1)=-2,这也就是为什么还要反码等其他码;
为了解决这个原码做减法这个问题,就设计了一个反码原理,再来一颗栗子(反码):
通过上面那个例子,大家对原码和反码多点了解吗?其实反码还有一个问题,那就是“0”这个特殊的数值;虽然大家对+0和-0的理解上是一样的,但是上面的0带符号不是就没有意义啦,而且[ 0000 0000]和[ 1000 0000]两个编码都表示0的意思;
于是补码这个原理就来了,还是和上面一样,先来个栗子:
上面的栗子用了[0000 0000]表示0,而以前出现-0的奇特数值,就没有啦!并且可以用[1000 0000]表示-128;
补码的出现,解决了0的符号以及两个编码的问题,而且还能够多表示一个最低数;
这就是为什么是8位的二进制,使用原码或反码表示的范围:[ -127,+127 ],而使用补码表示的范围为[ -128,,127];
因为机器使用补码,对于编码中常用到的32位int类型,可以表示的范围是:[-2^31,2^31-1],因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值;
更深入的了解???——》
将减法变成加法,这背后究竟蕴含了怎么的数学原理呢?
首先将钟表想象成是一个1位的12进制;如果当前时间是6点,而我希望的是将时间设置成4点,那我们需要怎么做呢?
解决方式有:
1、往回拨2个小时:6-2=4;
2、往前拨10个小时:(6+10)mod 12 = 4;
3、往前拨10+12=22个小时:(6+22)mod 12 = 4;
2,3方法中的mod是指取模操作,16 mod 12 = 4,即用16除以12的余数是4;从这3个方法中我们可以看到出,钟表往回拨(减法)的结果可以用往前拨(加法)代替;
现在的焦点就是落在了如何用一个正数来代替一个负数;通过上面的解决方式,我们可以感觉到一些规律,但是数学可是用逻辑来计算的,不能凭着个人的感觉来;
现在,我就来给大家来介绍下同余和负数取模的概念:
同余概念:两个整数a,b;若它们除以整数m所得的余数相等,则称a,b对于模m同余;
负数取模:
mod运算的数学定义:
公式的意思:x mod y等于x减去y乘上x与y的商的下界
再来一个栗子,今天可吃了不少栗子~哦!
-3 mod 2
= -3 -2*
那接下来就求证一下有关钟表的问题啦!