好的,所以在我学期间休息期间,我正在学习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,但我不确定为什么我得到了错误的值。谁能解释我做错了什么?
答案 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;
}