将负十进制转换为二进制

时间:2014-06-30 14:58:41

标签: c bit-manipulation

所以,我制作了这段代码。 基本上,接受数字,然后如果是负数,则将其转换为正数,计算其二进制数,然后计算其一个补数,然后加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的赞美形式吗?

1 个答案:

答案 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,但我并不真正关心确切的结果,因为我知道我发现了什么是错的,可以解释错误的位置。