原码,反码,补码,移码的表示范围以及数据溢出

1.表示范围:

假设二进制机器字长是n+1位,且为整数

原码表示的范围: −(2^{n}-1)≤  x  ≤2^{n}-1

反码表示的范围: −(2^{n}-1)≤  x  ≤2^{n}-1

补码表示的范围:      −2^{n}≤  x  ≤2^{n}-1

移码表示的范围:      −2^{n}≤  x  ≤2^{n}-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.数据溢出:

方法总结:


如果超过该范围的最大值,正值,那么使用该数值减去2^{n}  (n是多少bit 1字节=8bit 2字节=16bit),例如200,超过了127,则200-2^{8}=-56 在该区间内,输出-56
例如500,超过了127,则500-256=244,不在该区间,继续减去256,244-256=-12,在该区间内,输出-12

如果超过该范围的最小值,负值,那么使用该数值加上2^{n} (n是多少bit 1字节=8bit 2字节=16bit),例如-200,超过了最小值,则-200+2^{8}=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位,表示范围为(补码):−2^{15}≤  x  ≤2^{15}-1
int为32位,表示范围为(补码):−2^{31}≤  x  ≤2^{31}-1
i = 65537,超出最大表示范围,使用上述我讲的方法计算,则 65537-2^{16}=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 - 2^{8} = -101;
方法二:9BH转化为二进制为10011011,补码10011011转为原码为11100101,转换为十进制为-101;

  • 20
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值