数值数据分为有符号数和无符号数。无符号数最高位表示数值,而有符号数最高位表示符号。有符号数有不同的编码方式,常用的是补码。 (1)原码: 最高位表示符号(正数用 0, 负数用 1 ),其它位为该数的二进制数值,称为有符号数的原码表示。
① 小数原码的定义 | [X] 原 = | | X | 0≤X < 1 | | 1 - X | - 1 < X ≤ 0 |
例如: X=+0.1011 , [X] 原 = 0.1011 X= - 0.1011 [X] 原 = 1.1011
② 整数原码的定义 | [X] 原 = | | X | 0≤X < | | - X | - < X ≤ 0 |
【例】 X=45D=00101101B [X] 原 = 00101101B X=-45D [X] 原 =10101101B 原码表示简单易懂,但若是两个异号数相加(或两个同号数相减) , 就要做减法。为了把减法运算转换为加法运算就引进了反码和补码。
(2)反码: 正数的反码与原码相同,符号位用 0 表示,数值位不变。负数的反码符号位用 1 表示 , 数值位为原码数值位按位取反形成,即 0 变 1 、 1 变 0 。
① 小数反码的定义 | [X] 反 = | | X | 0≤X < 1 | | 2 - - X | - 1 < X ≤ 0 |
例如: X=+0.1011 [X] 反 = 0.1011 X= - 0.1011 [X] 反 = 1.0100 ② 整数反码的定义 | [X] 反 = | | X | 0≤X < | | - 1 - X | - < X ≤ 0 |
【例】 X=45D=00101101B, [X] 反 =00101101B X=-45D [X] 反 =11010010B ( 3 )补码: 正数的补码与原码相同,即符号位用 0 表示,数值位不变。负数的补码为反码加 1 形成。 ① 小数补码的定义 | [X] 补 = | | X | 0≤X < 1 | | 2 + X | - 1 ≤ X < 0 |
例如: X=+0.1011, [X] 补 = 0.1011 X= - 0.1011, [X] 补 = 1.0101 ② 整数补码的定义 | [X] 补 = | | X | 0≤X < | | + X | - ≤ X < 0 |
【例】 X=45D=00101101B [X] 补 =00101101B X=-45 D [X] 补 =11010011B
(4)符号扩展: 在数据处理时,有时需要把 8 位二进制数扩展成 16 位二进制数。 当要扩展的数是无符号数时,可在最高位前扩展 8 个 0 。 如果要扩展的数是补码形式的有符号数,那么就要进行符号位的扩展。符号扩展后,其结果仍是该数的补码。 (5)数据的表示范围和大小 n 位二进制数能表示的无符号整数的范围是 : 0 ≤ I ≤ ; n 位二进制数能表示的有符号整数的范围是 : - ≤ I ≤ +-1 (6)补码的加法和减法 1 、运算规则 [X + Y] 补 = [X] 补 + [Y] 补 [X - Y] 补 = [X] 补 + [ - Y] 补 若已知 [Y] 补 ,求 [ - Y] 补 的方法是:将 [Y] 补 的各位(包括符号位)逐位取反再在最低位加 1 即可。 例如: [Y] 补 = 101101 [ - Y] 补 = 010011 2 、溢出判断,一般用双符号位进行判断: 符号位 00 表示正数 11 表示负数 结果的符号位为 01 时,称为上溢;为 10 时,称为下溢 例题:设 x=0.1101 , y= - 0.0111 ,符号位为双符号位 用补码求 x+y , x - y [x] 补 +[y] 补 =00 1101+11 1001=00 0110 [x - y] 补 =[x] 补 +[ - y] 补 =00 1101+00 0111=01 0100 结果错误,正溢出 补码的特性: [[ X ] 补]补 ==> [- X ] 补 [[-X]补]补 ==> [ X ] 补 补码的加法规则: [ X+Y ] 补 =[ X ] 补+ [ Y ] 补 补码的减法规则: [ X - Y ] 补 =[ X ] 补+ [- Y ] 补
|