《真值原码反码补码详解和习题》由会员分享,可在线阅读,更多相关《真值原码反码补码详解和习题(8页珍藏版)》请在金锄头文库上搜索。
1、原码、反码和补码的概念本节要求掌握原码、反码、补码的概念知识精讲数值型数据的表示按小数点的处理可分为定点数和浮点数;按符号位有原码、反码和补码三种形式的机器数。一计算机中数据的表示方法1、数的定点与浮点表示在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。缺点:只有纯小数或整数才能用定点数表示;浮点数:小数点在数中的位置是浮动的、不固定的数。一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数,总可以表示成: PS、均为二进
2、制数,为的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围为 N 的尾数,一般为定点小数 ,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定了浮点数的精度,且规格化浮点数 0.5|S|;0.1B=( 1/2 )D =( 2-1 )D0.11B=(1/2 + 1/4 )D =( 2-1 + 2-2 )D0.111B=(1/2 + 1/4 + 1/8 )D =( 2-1 + 2-2 + 2-3)D -在计算机中表示一个浮点数其结构为:阶码部分 尾数部分阶符 阶数 尾符 尾数Ef E1E2Em Sf S1S2Sn假设用八个二进制位来表示一个浮点数,
3、且阶码部分占 4 位,其中阶符占一位;尾数部分占 4 位,尾符也占一位。若现有一个二进制数 N(101100 )2 可表示为: 1100.1011,则该数在机器内的表示形式为:101100B= 10110B * (21)D101100B= 1011B * (22)D101100B= 101.1B * (23)D101100B= 10.11B * (24)D101100B= 1.011B * (25)D101100B= 0.1011B * (26)D=0.1011B * (2110)B0 1 1 0 0 1 1 0 1一个浮点形式的尾数 S 若满足 0.5|S|1,且尾数的最高位数为 1,无无效
4、的 0,则该浮点数称为规格化数;规格化数可以提高运算的精度。S 为原码表示,则 S=1规格化数S 为补码表示 N 为正数,则 S1 N 为负数,则 S1二、原码、反码和补码1、机器数与真值机器数:在计算机中数据和符号全部数字化,最高位为符号位,且用 0 表示正、1 表示负,那么把包括符号在内的一个二进制数我们称为机器数,机器数: 有原码、反码和补码三种表示方法。比如,十进制中的数 +3 ,计算机字长为 8 位,转换成二进制就是 00000011。如果是 -3 ,就是10000011 。 那么,这里的 00000011 和 10000011 就是机器数。真值:用“+” 、 “”号表示的二进制数。
5、机器数因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位 1 代表负,其真正数值是 -3 而不是形式值 131(10000011 转换成十进制等于 131) 。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001 的真值 = +000 0001 = +1,1000 0001 的真值 = -000 0001 = -12、原码、反码和补码的概念1)概念机器数: 有原码、反码和补码三种表示方法。原码:是最简单的机器数表示法。其数符位用 0 表示正,1 表示负,其余各位表示真值本身。即用第一位表示符号, 其余位
6、表示值,比如如果是 8 位二进制:1 的原码是 00000001,1 的原码是 10000001。反码:正数的反码同原码, 负数的反码为除符号位外,其它各位按位取反。正数的反码是其本身, 负数的反码是在其原码的基础上,符号位不变,其余各个位取反1 的反码是 00000001,1 的反码是 11111110。补码:正数的补码同原码,负数的补码为反码加 1。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+11 的补码是 00000001,1 的补码是 11111110。2)转换方法当真值为正数时,原码、反码、补码 3 种机器数的最高位均为 0当真值为负数时,原码、反码、补码 3
7、 种机器数的最高位均为 1机器数的最高位为符号位,其它位称为数值位。当真值为正数时,原码=反码=补码;当真值为负数时,三种机器数的符号位相同,均为 1,原码的数值位保持“原”样,反码的数值位是原码数值位的“按位取反” ,补码的数值位是原码的数值位的 “按位取反”后再加 1,简称“取反加 1”。当真值为负数时:补码 = 反码+1当真值为负数时:原码 = 补码 取补 补码 = 原码 取补 -x补= 模 - x补 x补= 模 - -x补 比如 8bit,模= 28=1_0000_0000 例如:(1)假设码长为 8 位,写出下列数的原码、反码和补码。根据本题可得到结论:0 的原码、反码各有两种表示方
8、法,而补码是唯一的全 0 表示。真值 +0 -0 +1 -1 +127 -127 -128原码 00000000 10000000 00000001 10000001 01111111 11111111 溢出反码 00000000 11111111 00000001 11111110 01111111 10000000 溢出补码 00000000 00000000 00000001 11111111 01111111 10000001 10000000(2)假设码长为 8 位,写出原码、反码和补码所能表示定点整数和定点小数的范围。二进制定点整数 十进制定点整数 n 位可表示的个数 二进制定点小
9、数 十进制定点小数原码1111111101111111-127+127 2n-1 个 1.11111110.1111111-127/128+127/128反码1000000001111111-127+127 2n-1 个 1.11111110.1111111-127/128+127/128补码1000000001111111-128+127(-128)代替了 (-0) 2n 个 1.11111110.1111111-1-127/128由此可见:n 位的二进制数用原码表示,则可表示的数的个数为 2n-1 个;n 位的二进制数用反码表示,则可表示的数的个数为 2n1 个;n 位的二进制数用补码表示
10、,则可表示的数的个数为 n 个。比如:补码中用(-128)代替了(-0)编程中常用到的 32 位 int 类型,可以表示范围是: -231 231 -1 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值 -2G 2G -13、算术运算计算机中的算术运算一般可采用补码进行,用补码表示的两个操作数进行算术运算,符号位可直接参加运算,结果仍为补码。定点补码加法运算运算规则:x+y 补 x 取补 y 补定点补码减法运算运算规则:xy 补 x+(-y) 补 x 补 y 补y 补 的求法是将y 补 的各位(包括符号位)全取反,最末位加。即将y 补 连同符号位一起取反加 1 便可得到 y 补
11、 。 -x补= 模 - x补x补= 模 - -x补 比如 8bit,模= 28如:y补 =10001010,则y 补 =01110110; -1补= 28 - 1补=1_0000_0000 - 0000_0001 = 1111_1111y补 =0100,则y 补 =1100; -(-1)补= 28 - -1补=1_0000_0000 - 1111_1111 = 0000_0001 注意:在进行运算时有时会发生溢出。定点补码运算的溢出处理采用补码运算时若结果的数值超出了补码所能表示的范围,则此种情况称为溢出。若计算结果比能表示的最大数还大则称为上溢,上溢时一般作溢出中断处理;若计算结果比能表示的
12、最小数还小则称为下溢,下溢时一般作机器零处理。下面介绍用双符号判断溢出方法:引入两个符号位 Cs+1、C sCs+1 用来表示两个符号位向更高位进位时的状态,有进位时 Cs+1=1,无进位时 Cs+1=0;Cs 用来表示两数值的最高位向符号位进位时的状态,有进位时 Cs=1,无进位时 Cs=0;当 Cs+1Cs=00 或 11 时,无溢出;当 Cs+1Cs=01 或 10 时,有溢出,当双符号位为 01 时正溢出,当双符号位为 10 时负溢出;例如:x 补 =10011100,y 补 =10011000,则x+y 补 = 。溢出,因为 Cs+1Cs=10。故溢出逻辑表达式为 VC s+1C s
13、无符号数的运算无符号数的运算实际上是指参加运算的操作数 X、Y 均为正数,且整个字长全部用于表示数值部分。当两个无符号数相加时,其值在字长表示的范围内,其结果为正数。当两个无符号数相减时,其值的符号位取决于两数绝对值的大小。另外,地址在计算机中用无符号数表示。四原码, 反码, 补码再深入 计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢?将钟表想象成是一个 1 位的 12 进制数. 如果当前时间是 6 点, 我希望将时间设置成 4 点, 我们可以: 1. 往回拨 2 个小时: 6 - 2 = 4 2. 往前拨 10 个小时: (6 + 10) mod 12 =
14、 4 3. 往前拨 10+12=22 个小时: (6+22) mod 12 =4 2,3 方法中的 mod 是指取模操作, 16 mod 12 =4 即用 16 除以 12 后的余数是 4. 所以钟表往回拨(减法)的结果可以用往前拨(加法)替代! 现在的焦点就落在了如何用一个正数, 来替代一个负数. 上面的例子我们能感觉出来一些端倪, 发现一些规律. 但是数学是严谨的. 不能靠感觉. 首先介绍一个数学中相关的概念: 同余“模”是指一个计量系统的计数范围例如:时钟的计量范围是 011,模=12。表示 n 位的计算机计量范围是 02 n -1,模=2 n“模”实质上是计量器产生“溢出”的量,它的值
15、在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。比如:时钟(模=12)中,加 8 和减 4 效果是一样的,因此凡是减 4 运算,都可以用加 8 来代替对时钟(模=12)而言,8 和 4 互为补数。以 12 模的系统中,11 和 1;10 和 2;9 和 3;7 和 5;6 和 6 都互为补数。共同的特点是两者相加等于模对于计算机,其概念和方法完全一样。n 位计算机,设 n=8, 所能表示的最大数是 11111111,若再加 1 称为 100000000(9 位)但因只有 8 位,最高位 1 自然丢失。又回了 00000000,所以 8 位二进制系统的模为 28。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。-x补= 模 - x补x补= 模 - -x补 比如 8bit,模= 28-1补= 28 - 1补=1_0000_0000 - 0000_0001 = 1111_1111-(-1)补= 28 - -1补=1_