C语言原码补码问题2
发布网友
发布时间:2023-10-16 08:24
我来回答
共3个回答
热心网友
时间:2024-12-10 12:04
你的这个是16的,我可以给你用8位解释一下(原理是一样的,我打起来比较方便~)
我们知道,8位二进制的补码表示范围是-128~127对吧。
而在计算机中数据都是以二进制补码进行存储的,那么-128的存储方式就是1000 0000,而它是没有原码和反码的,所以你不太能验证,对吧。
这是因为在计算机中,为了溢出特意定义的一个小玩意儿~
所以放到16来解释,它的最小值也是-32768。
但这已经是最小的数了,再减就会溢出……(理论上是这样的)
但是现实中的程序编译有一定的容错性,只要到了一定的计算机承认的位数就变成-1了。
这是因为计算机中的数好像一个轮回……
这个是我的计算机能接受的范围。
(我的计算机是32位的~)
经过实践验证了我说的东西……
如果你的程序要求指定了16位,那么就是-1,如果高于16位,就是 -32769。
热心网友
时间:2024-12-10 12:04
整数有正整数和负整数,为了表示负数,一般用最高位来表示符号,因此,最高位是不能用来表示数值的。所以,一个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 ,不浪费编码空间。
热心网友
时间:2024-12-10 12:05
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
你给的10000000 00000000是用补码表示的。
也就是说:-32768的原码是:11000000000000000
那么他的补码就是符号位不变,其余各位取反再加1。
希望能帮到你。