在过去的几个小时中,我一直在尝试将第一位为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);
}

07-24 09:51
查看更多