从十六进制转换为2的补码

时间:2017-09-25 02:39:17

标签: c

我试图将给定的十六进制转换为2的补码数,但在我的程序中出现奇怪的事情。 (赋值是取两个给定的数字,可以是八进制,二进制,十六进制或十进制,加/减它们,然后转换为给定的基数)

我使用命令:./ a.out + x1111 x1111 x

#include <stdio.h>

int main (int argc, char* arg[]){
  int num1=0, num2=0, converted = 0;
  if ((argc < 5) || (argc > 5))
  {
    printf("ERROR: please enter input in the following format\n");
    printf("/calc <operation> <number1> <number2> <output base>\n");
  }
  else{
    if (arg[2][0] == 'x'){
      num1 = HexAsciiTo2comp(arg[2]);
      printf("%d\n", num1);
    }
    if (arg[3][0] == 'x'){
      num2 = HexAsciiTo2comp(arg[3]);
      printf("%d\n", num2);
    }
  }
  converted = num1 + num2;
  finalOutput(converted, arg[4]);
  return 0;
}

int HexAsciiTo2comp(char* hexNum){
  int value = 0, i = 1;
  printf("The original Hex Value is %s\n", hexNum);
  for(i=1; i<9; i++){
    switch(hexNum[i]){
          case '0': value = value << 4; break;
          case '1': value = (value << 4)+1; break;
          case '2': value = (value << 4)+2; break;
          case '3': value = (value << 4)+3; break;
          case '4': value = (value << 4)+4; break;
          case '5': value = (value << 4)+5; break;
          case '6': value = (value << 4)+6; break;
          case '7': value = (value << 4)+7; break;
          case '8': value = (value << 4)+8; break;
          case '9': value = (value << 4)+9; break;
          case 'A': value = (value << 4)+10; break;
          case 'B': value = (value << 4)+11; break;
          case 'C': value = (value << 4)+12; break;
          case 'D': value = (value << 4)+13; break;
          case 'E': value = (value << 4)+14; break;
          case 'F': value = (value << 4)+15; break;
          default:break;
          }
        }return value;
}

结果最终成为:

The original Hex Value is x1111
1118481
The original Hex Value is x1111
4369

4369的后一个结果是正确的,但第一个输出是不正确的。 为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

只要for为真,i < 9循环就会运行,但输入字符串较小。这意味着您还必须检查字符串结尾(i < 9 && hexNum[i] != '\0'),否则您将访问字符串之外的数据。