所以,我制作了这段代码。 基本上,接受数字,然后如果是负数,则将其转换为正数,计算其二进制数,然后计算其一个补数,然后加1。
#include <stdio.h>
int main (void)
{
int bin[8]={0};
int sum[8];
int orig,num,i=0,j;
int addn[8] = {0,0,0,0,0,0,0,1};
int carry = 0;
printf("Please enter the number\n");
scanf("%d",&num);
if ( num < 0 )
{
orig = num;
num = -num;
}
while (num!= 0)
{
bin[8-i-1] = num%2;
num = num/2;
i++;
}
for ( j = 0; j < 8; j++ )
{
printf("%d",bin[j]);
}
printf("\n");
if ( orig < 0 )
{
for ( i = 0; i < 8; i++ )
{
if (bin[i] == 0)
bin[i] = 1;
else
bin[i] = 0;
}
for ( i = 0; i < 8; i++ )
{
sum[i] = ((bin[i]^addn[i])^carry);
carry = ((bin[i] & addn[i])| (bin[i] & carry) | (addn[i] & carry) );
}
printf("The 2's complement of the number is \n");
printf("%d",carry);
for ( i = 0; i < 8; i++ )
{
printf("%d",sum[i]);
}
printf("\n");
}
return 0;
}
当我输入值为4时,它会正确显示其二进制值。然而,它显示其2赞美为111111010(这是随身携带)。为什么会这样? 2的恭维形式应该是不同的。
此外,还有其他方法可以将负数转换为2的赞美形式吗?
答案 0 :(得分:1)
如果你检查1的补码,你会发现它是正确的。
滑动是,您将MSB存储在num [0]中,LSB存储在num [7]中,因此当您添加时,您需要从7端开始,而不是从0端开始。将(8-i-1)放在所有添加部分中,产生更像:
./a.out
Please enter the number
-4
00000100
The 1's complement of the number is
11111011
The 2's complement of the number is
011111001
看起来几乎在低端,但是标志位看起来不对,因为你突然输出9位,你可能打算显示溢出的进位吗?我对你的输出意图有点困惑,我甚至没有仔细检查过这部分内容。
我还不会发布固定来源,您应该尝试通过添加额外的printf和最初输入数字的推理来学习自己调试。
感谢这个漂亮的示例程序,尽管它可以通过一些严肃的重构来实现清晰度。这是一项学习练习吗?如果是这样,你真的应该学会自己发现错误。
这里有我想要的更正,但第一次输入不正确:)
所以检查1的补码是否正确:
printf("The 1's complement of the number is \n");
for ( j = 0; j < 8; j++ )
{
printf("%d",bin[j]);
}
printf("\n");
开始添加之前。然后修复:
for ( i = 0; i < 8; i++ )
{
sum[8-i-1] = ((bin[8-i-1]^addn[8-i-1])^carry);
carry = ((bin[8-i-1] & addn[8-i-1])| (bin[8-i-1] & carry) | (addn[8-i-1] & carry) );
}
最初我有错字((bin[i-i-1]^addn
,但我并不真正关心确切的结果,因为我知道我发现了什么是错的,可以解释错误的位置。