在C中操纵值

时间:2016-01-02 16:11:03

标签: c

好的,所以在我学期间休息期间,我正在学习C.我正在使用我编写的汇编类中的旧项目并将它们转换为C.我正在处理的程序采用整数然后打印出来2,comp,1& comp,neg 1& comp,neg signed mag的int,hex,二进制值。到目前为止我已经写过了。

#include <stdio.h>
int main(int argc, char* argv[])
{
    int counter = 0, bit = 0;
    long int number, binVal, hexVal = 0, i = 1, remainder;

    printf("Enter an integer number: ");
    scanf("%ld", &number);

    printf("2's compliment:\t%ld\t", number);
    binVal == &number;
    while(binVal != 0)
    {
        remainder = binVal % 10;
        hexVal = hexVal + remainder * i;
        i = i * 2;
        binVal = binVal / 10;
    }

    printf("%lX\t", hexVal);

    for (counter = 31; counter >= 0; counter--)
    {
        bit = number >> counter;
        printf("%s",(bit & 1) ? "1" : "0");
    }

    printf("\n");

    return 0;
}

我的问题是这个。正如我编写的那样,如果我输入值15,我得到正确的32位二进制值但我的十六进制值= 7.如果我输入1111我得到正确的十六进制值F但我得到二进制值00000000000000000000010001010111。现在我知道int值在内存中存储为2的comp,但我不确定为什么我得到了错误的值。谁能解释我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用printf printf("%lX\t", hexVal);你必须通过 基数为10的值,不需要先前的交易。

这些代码行将二进制转换为基数10:

while(binVal != 0)
{
    remainder = binVal % 10;
    hexVal = hexVal + remainder * i;
    i = i * 2;
    binVal = binVal / 10;
}

这是你不想要的。 如果要打印十六进制值,只需调用

即可
printf("%lX\t", number);

或手动执行

#include <stdio.h>
int main(int argc, char* argv[])
{
    int counter = 0;
    long int number, remainder;

    printf("Enter an integer number: ");
    scanf("%ld", &number);
    printf("\n");

    printf("2's compliment:\t%ld\t\n", number);

    printf("0x");
    for (counter = 28; counter >= 0; counter-= 4)
    {
        remainder = (number >> counter) & 0xF;
        if (remainder < 10)
            printf("%d", remainder);
        else
            printf("%c", 'A' + remainder - 10);
    }

    printf("\n");

    for (counter = 31; counter >= 0; counter--)
    {
        printf("%d", (number >> counter) & 1);
    }

    printf("\n");

    return 0;
}