c语言实现补码加法运算和原码的加法运算

内容:输入两个数(补码或者原码),屏幕上显示出运算过程(利用竖式的表示方法)
要求:1、编1位原码相加运算,2、编1位补码相加运算3、编2位补码相加运算

用数组来做就是了,byte数组或bit数组,先将数模2运算得到各位的值,存入数组中,之后一个循环来做二进制加减法就成了,溢出的判断也很简单,根据两个运算数的模与他们的符号,还有所进行的运算,用几个if语句就解决了追问

能用具体的代码帮我实现吗,我知道意思,但是代码写不出来

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