中易网

C语言原码补码问题

答案:2  悬赏:50  
解决时间 2021-01-13 04:15
  • 提问者网友:容嬷嬷拿针来
  • 2021-01-12 11:34
C语言原码补码问题
最佳答案
  • 二级知识专家网友:风格不统一
  • 2021-01-12 11:46
整数有正整数和负整数,为了表示负数,一般用最高位来表示符号,因此,最高位是不能用来表示数值的。所以,一个16位的整数最大值为:

2^15=32767(10)=7FFF(16)=0111 1111 1111 1111(2),括号后面是进制。
也就是除去最高位,用来保存数值的位数是总位数-1,也就是15位。

而用1代表负数,0代表正数,按理,最小负数就应该是最高位设1:
FFFF(16)= - 32767 = 1111 1111 1111 1111(2)

但是这样的话,0值就有正负之分了,但数学上0是中性的没有正负之分,那么假如保留正0代表0,另一个,也就是1000 0000 0000 0000(2)就浪费了。因此编码专家采用补码表示法来表示负数,而正数保留原来的编码形式,叫做原码表示法。

补码是在原码基础上按位取反+1,也即:
取-32767的绝对值,也即去符号为32767(10)=7FFF(16)=0111 1111 1111 1111(2)
按位取反:1000 0000 0000 0000(2)
+1:1000 0000 0000 0001(2)
转换成16进制就是:8001
打印输出时,由于最高位为1,因此系统认为是负数,就按补码解码,输出为 -32767。

再来看看 -1
取-1的绝对值后的为1(10)=0001(16)=0000 0000 0000 0001(2)
按位取反:1111 1111 1111 1110(2)
+1:1111 1111 1111 1111(2)
转换成16进制: FFFF
同样打印输出时按补码解码,输出为-1

可见负数的绝对值越小(比如1),补码数值部分越大(7FFF),绝对值越大7FFF,补码数值部分越小0001,使得编码与原码的编码相反。这样,负0编码就可以看做 -32768了,把负0编码利用起来了。

验证一下 -32768:
取-32768的绝对值为32768(10)=8000(16)= 1000 0000 0000 0000(2)
按位取反: 0111 1111 1111 1111(2)
+1:1000 0000 0000 0000(2)
转换成16进制:8000

如果不用补码表示而是用原码表示负数数值,那么编码1000 0000 0000 0000(2)表示的是负0,且负数端最小值为 -32767,而采用补码表示,负0这个编码可以利用起来用来表示-32768。使得整数范围增加了1,达到-32768- +32767 ,不浪费编码空间。
全部回答
  • 1楼网友:愁杀梦里人
  • 2021-01-12 12:46
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[
你的这个是16的,我可以给你用8位解释一下(原理是一样的,我打起来比较方便~)
我们知道,8位二进制的补码表示范围是-128~127对吧。
而在计算机中数据都是以二进制补码进行存储的,那么-128的存储方式就是1000 0000,而它是没有原码和反码的,所以你不太能验证,对吧。
这是因为在计算机中,为了溢出特意定义的一个小玩意儿~
所以放到16来解释,它的最小值也是-32768。
但这已经是最小的数了,再减就会溢出……(理论上是这样的)
但是现实中的程序编译有一定的容错性,只要到了一定的计算机承认的位数就变成-1了。
这是因为计算机中的数好像一个轮回……

这个是我的计算机能接受的范围。



(我的计算机是32位的~)


经过实践验证了我说的东西……


如果你的程序要求指定了16位,那么就是-1,如果高于16位,就是 -32769。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息