在过去的几个小时中,我一直在尝试将第一位为1的负二进制数转换为十进制数。二进制补码转换似乎是不可能的,但是我相信必须有一些更简单的方法来完成此操作,因为这仅仅是C语言入门班的开始。
int power;
int count = 0;
int length = strlen(value);
int result = 0;
int negResult = 0;
int i = length - 1;
int j;
if (value[0] == '1') {
for (; i >= 0; i--) {
if (value[i] == '1')
result += 1;
result << 1;
}
printf("%d\n", result);
result = ~result;
result += 1;
printf("%d\n", result);
for (j = 8; j > 0; j--) {
if (result << (8-j) == 1) {
power = (int) pow(2,count);
negResult += power;
}
count++;
}
printf("-%d\n", negResult);
}
else {
for (; i >= 0; i--) {
if (value[i] == '1') {
power = (int) pow(2,count);
result = result + power;
}
count++;
}
printf("%d\n", result);
}
}
我通过了:
binary_to_decimal("10011011");
然后每个
printf
我得到5,然后是-5,然后是-0。我没有包含将其实际转换为十进制的代码,因为对于正二进制,它可以正常工作;我相信,一旦二进制补码工作了,它也应适用于负二进制。
最佳答案
您可能不清楚temp += '0'
在做什么。它不是在生成字符串,而是在偏移未初始化的指针,并且是您在temp2[j]
中实际使用它时导致段错误的原因。要像我想的那样使用字符串,请查看strcat()
。
我会把它当作垃圾,然后重新开始。不要操纵字符串中的字符,只需将字符串转换为二进制即可。编写一些代码,将输入字符串从第一个字符移到最后一个字符。为您的答案保留一个result
整数,最初为0
。在遍历字符串时,移动result << 1
,然后如果看到一个字符'1'
,请在1
上添加一个数字result
。如果您在字符串中看到'0'
,则不要添加任何内容,但无论哪种情况,都请先左移。
这将使您获得二进制数,无论您拥有多少位。对于负数(最高(第一个)位='1'),您需要对符号扩展,方法是对符号位上方的所有位进行“ 1”或运算,对结果进行按位求反并加1。查看其工作原理,并注意输入字符串不能太长。祝大家好运。
int length = strlen(value);
unsigned int result = 0;
unsigned int signExtend;
unsigned int negResult = 0;
// assemble incoming chars as bits in an unsigned int
for (int i=0;i<length;i++) {
result = result << 1;
if (value[i] == '1')
result += 1;
}
printf("0x%x, %d\n", result, result); // see it is a hex number and a decimal
// if negative, convert to positive number
if (value[0] == '1') {
// first, sign-extend
signExtend = (1 << (length-1));
signExtend -= 1;
signExtend = ~signExtend;
result |= signExtend;
printf("signExtend mask = 0x%x, sign-extended number = %x\n", signExtend, result);
// then, two's complement
negResult = ~result;
negResult += 1;
// show the result with the '-' sign explicitly added:
printf("result is -%d\n", negResult);
// but actually, once you have sign extended,
// you can cast the result as signed and just print it:
printf("result as signed int = %d\n", (int)result);
} else {
// positive result, just print it
printf("result is %d\n", result);
}