c语言中为什么-0177777要转换成原码真值是-1。0123就不用转换,真值是83

c语言中为什么-0177777要转换成原码真值是-1。0123就不用转换,真值是83大一课本上的,看了很多遍。还是不懂,急求

0177777二进制是16个1,如果是16位二进制表示十进制数-1,16位以上的二进制(如32位)表示65535
0123只有7位二进制,用16位二进制表示是0000000001010011,表示十进制83

记住,二进制的最高位是符号位,该位为1表示负数,负数一律使用补码(以前还有原码和反码表示负数,现已淘汰)追问

就是说有16位才转换?其他不用转换了?

追答

记住,二进制的最高位是符号位,该位为1表示负数,负数一律使用补码(以前还有原码和反码表示负数,现已淘汰)

也就是说,不管多少位,必须最高位为1才会视为补码,如前面提到的0177777如果放到32位二进制中就不会视为补码(因为16个1前面还有16个0,最高位就不是1),转换为十进制就是65535而不是-1

比如说
如果是8位二进制,则0x80也会被视为负数,因二进制为10000000,由于最高位为1,表示十进制-128,放到16位二进制里面就是0000000010000000,这样的话就表示128

追问

好的。谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-24
整数有正整数和负整数,为了表示负数,一般用最高位来表示符号,因此,最高位是不能用来表示数值的。所以,一个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
,不浪费编码空间。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网