1.表示范围:
假设二进制机器字长是n+1位,且为整数
原码表示的范围: −(-1)≤ x ≤-1
反码表示的范围: −(-1)≤ x ≤-1
补码表示的范围: −≤ x ≤-1
移码表示的范围: −≤ x ≤-1
移码的符号位中0表示负数,1表示正数,简单来说,原码的补码数值位不变,符号位取反就是移码。
对于8位寄存器:
原码表示范围为 -127-127,即1111 1111~0111 1111
反码表示范围为 -127-127,即1000 0000~0111 1111
补码表示范围为 -128-127,即1000 0000~0111 1111
移码表示范围为 -128-127,即0000 0000~1111 1111
2.数据溢出:
方法总结:
①
如果超过该范围的最大值,正值,那么使用该数值减去 (n是多少bit 1字节=8bit 2字节=16bit),例如200,超过了127,则200-=-56 在该区间内,输出-56
例如500,超过了127,则500-256=244,不在该区间,继续减去256,244-256=-12,在该区间内,输出-12
②
如果超过该范围的最小值,负值,那么使用该数值加上 (n是多少bit 1字节=8bit 2字节=16bit),例如-200,超过了最小值,则-200+=56 在该区间内,输出56
例如-600,超过了-127,则-600+256=-344,不在该区间,继续+256,-344+256=-88,在该区间内,输出--88
3.例题分析:
例题1:
若寄存器内容为00000000,若它等于-128,则为( C )
A. 原码
B. 补码
C. 移码
D. 反码
解题:
符号位为0,所以ABD即原码、反码、补码为正数,正数的原码、反码、补码相同,转换为十进制为0;
移码的符号位中0表示负数,00000000即为-128,由于-128超出8位寄存器原码和反码的范围,所以计算-128的时候不能使用符号位不变数值为取反加一,需要特殊记。
例题2:
下列代码的运行结果(B)
short i = 65537;
int j = i + 1;
printf(“i = % d, j = % d\n”, i, j);
A i=65537,j=65538
B i=1,j=2.
C i=-1,j=0
D i=1,j=65538
解题:
short为16位,表示范围为(补码):−≤ x ≤-1
int为32位,表示范围为(补码):−≤ x ≤-1
i = 65537,超出最大表示范围,使用上述我讲的方法计算,则 65537-=1;
根据程序自上而下执行,i = 1, j = i + 1 = 2,所以选B。
例题3:
设机器数采用补码表示(含1位符号位),若寄存器内容为9BH,则对应的十进制数为( D )
A. -97
B. -101
C. -27
D. 155
解题:
方法一:9BH转化为十进制为155,因为8位寄存器补码表示范围为 -128-127,溢出,使用上述我讲的方法计算,则155 - = -101;
方法二:9BH转化为二进制为10011011,补码10011011转为原码为11100101,转换为十进制为-101;