企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**1\. 机器数和真值** 二进制数有正负之分,如N1\=+0.101101,N2\=-0.101101,则N1是个正数,N2是个负数。机器不能直接把符号“+”、“-”表示出来,为了能在计算机中表示正负数,必须引入符号位,即把正负符号也用1位二进制数码来表示。把符号位和数值位一起编码来表示相应的数的表示方法包括:原码、补码、反码、移码等。 >[danger] 机器数:符号位也当做2进制数进行编码的数(又称机器码),所以它包括... 为了便于在计算机中表示,同时又便于与实际值相区分,在此首先引入机器数和真值的概念。 **机器数**  用二进制数“0”或“1”来表示数的符号,“0”表示正号,“1”表示负号,且把符号位置于该数的最高数值位之前(放在数的最前面),这样表示的数称为机器数(或称机器码),即把符号位和数值位一起编码来表示的数就是机器数。 **真值**  一 般书写中用“+”、“-”来表示数的符号,这样表示的数称为真值。 例如:N1\= +0.101101,N2\= -0.101101,这是真值,表示成机器数(以原码为例)就是\[N1\]原\= 0.101101,\[N2\]原\= 1.101101。 >[danger] 有正负号的实际值 机器数有原码、补码、反码和移码四种表示形式。下面以整数为例说明原码、补码、反码和移码的表示方法。 **2\. 原码** >[danger] 符号位加上数值的绝对值 符号位为0表示正数,为1表示负数,数值部分用二进制数的绝对值表示的方法称为原码表示法,通常用\[X\]原表示X的原码。 例如,要表示+59和-59的原码。假设机器数的位数8位(即机器的字长为8位),最高位是符号位,其余7位是数值位,那么,+59和-59的原码分别表示为: \[+59\]原\=00111011                  \[-59\]原\=10111011 写成一般式则为: 正数的原码         \[X\]原\=X             (0<X<2n-1) 负数的原码         \[X\]原\=2n-1\-X       (-2n-1<X<0) 注意:0的原码有两个值,有“正零”和“负零”之分,机器遇到这两种情况都当作0处理。 >[danger]\[+0\]原\=00000000                    \[-0\]原\=10000000 原码的表示方法简单易懂,与真值转换方便,但在进行加减法运算时,符号位不能直接参加运算,而是要分别计算符号位和数值位。当两数相加时,如果是同号,则数值相加;如果是异号,则要进行减法运算。而在进行减法运算时,还要比较绝对值的大小,然后用大数减去小数,最后还要给运算结果选择恰当的符号。 为了解决这些问题,人们引进了数的补码表示法。 **3\. 补码** >[danger] 先算出原码 符号位不变数值部分如果是0就变1如果是1就变0,最后在加1 什么是补码?我们先用日常生活中的实例来进行说明。假如现在时间是7点,而你的手表却指向了9点,如何调整手表的时间?有两种方法拨动时针,一种是顺时针拨,即向前拨动10个小时;另一种是逆时针拨,即向后拨2个小时。从数学的角度可以表示为: (9+10) -12=19-12=7 或 9-2=7 可见,对钟表来说,向前拨10个小时和向后拨2个小时的结果是一样的,减2可以用加10来代替。这是因为钟表是按12进位的,12就是它的“模”。对模12来说,-2与+10是“同余”的,也就是说,-2与+10对于模12来说是互为补数的。 计算机中的加法器是以2*n*为模的有模器件,因此可以引入补码,把减法运算转换为加法运算,以简化运算器的设计。 补码的定义:把某数X加上模数K,称为以K为模的X的补码。 \[X\]补\=K+X 因此,正数的补码的最高位为符号“0”,数值部分为该数本身;负数的补码的最高位为符号“1”,数值部分为用模减去该数的绝对值。 通过用模2n减去某数的绝对值的方法来求某数的补码比较麻烦,求一个二进制数的补码的简便方法是:正数的补码与其原码相同;负数的补码是符号位不变,数值位逐位取反(即求其反码),然后在最低位加1。 例如,\[+59\]补\=\[+59\]原\=00111011,而\[-59\]原\=10111011,因此,\[-59\]补\= 11000100+1 = 11000101。 注意:0的补码只有一种形式,就是n位0。 采用补码表示法进行加减法运算,比原码运算方便多了,符号位可以和数值位一起参加运算,而且不论数是正还是负,计算机总是做加法,减法运算可转换为加法运算。 **4\. 反码** 引入反码的目的是便于求负数的补码。 正数的反码与原码相同,负数的反码是符号位不变,数值位逐位取反。 例如:\[+59\]反\=\[+59\]原\=00111011,而\[-59\]原\=10111011,因此,\[-59\]反\=11000100。 注意:0的反码也有两个,\[+0\]反\=00000000,\[-0\]反\=11111111 在计算机中,求一个数的反码很容易,因此,求一个数的补码也就易于实现。 采用补码运算,计算机的控制线路较为简单,所以,目前大多数计算机均采用补码存储、补码运算,其运算结果仍为补码形式。 综上所述,在n位机中,用n位二进制数补码表示一个带符号的整数时,最高位为符号位,后面n-1位为数值部分。n位二进制数补码表示的范围为-2n-1~+2n-1\-1。例如,在8位机中,补码表示的范围为-128~+127。 **5)移码** 移码也称为增码或偏码,常用于表示浮点数中的阶码。 移码可由补码求得,只要把补码的符号位取反就得到了移码。 # 机器数与原码有区别吗? 在计算机中表示的带符号的二进制数称为机器数。原码是机器数的一种表示方式 >[danger](1)1和-1的原码分别是多少? [+1]原 = 0000 0001 [-1]原 = 1000 0001 >[danger](2)一个字节的存储空间存储的数值的范围是多少? [1111 1111 , 0111 1111] 也就是 [-127 , 127] >[danger](3)1和-1的反码分别是多少? [+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反 >[danger](4)1和-1的补码分别是多少? [+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补 >[danger](5)分别用反码和补码计算1-1=0,看有啥区别? 1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0 1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = \[0000 0001\]反 + \[1111 1110\]反=[0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原 >[info]注意 (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。  (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 >[danger](6)已知一个补码为11111001,计算它的原码 因为符号位为“1”,表示是一个负数,所以该位不变,仍为   “1”;其余7位1111001取反后为0000110;再加1,所以是10000111(-7)。 >[danger](7)假如用16位表示十进制数-100,则它的原码,反码,补码分别是多少? (-100)= [1000 0000 0110 0100]原 (-100)= [1111 1111 1001 1011]反 (-100)= [1111 1111 1001 1100]补 >[danger](8) 十六位机器码的原码反码补码怎么算 比如:用十六位机器码1110001010000000来表示定点整数(最高位为符号位),当它是原码时表示的十进制真值为 多少?。当它是补码时表示的十进制真值是 多少? ;当它是反码时表示的十进制真值是多少?。怎么算 十六位机器码1110,0010,1000,0000 不管它是什么码,首先都要先将它转化为原码再做计算! 当它是原码时就直接转化为十进制的! (注释2ˇ3=8) =-(2ˇ7)+(2ˇ9)+(2ˇ13)+(2ˇ14)=-25216 -25216就是真值 ! 当它是补码时:先将它转化为原码,方法就是补码的补码就等于原码! 补码:1110,0010,1000,0000 原码:1001,1101,1000,0000 =-(2ˇ7)+(2ˇ8)+(2ˇ10)+(2ˇ11)+(2ˇ12)=-7552 -7552就是真值 当它是反码时: 反码:1110,0010,1000,0000 原码:1001,1101,0111,1111 =-1+2+4+8+16+32+64+256+1024+2048+4096=-7551 -7551就是真值