Превращение отрицательного десятичного числа в его двоичное представление

#c #binary #decimal #data-conversion

#c #двоичный #десятичное #преобразование данных

Вопрос:

Я пытаюсь найти способ, которым я могу принимать входные данные от пользователя и отображать их в массиве BinRep[] . В настоящее время эта программа работает только для положительных чисел, однако мне трудно найти способ заставить ее работать и для отрицательных чисел. Есть идеи?

 int n = atoi(argv[1]);
  int binRep[N];
  int i;
  int flippedNum;

  for (i = 0; i < N; i  ) {
    binRep[i] = 0;
  }

  i = 0;

  while (n > 0) {
    binRep[i] = n % 2;
    n = n / 2;
    i  ;
  }

  for (i = N - 1; i >= 0; i--) {
    printf("%d", binRep[i]);
  }
  printf("n");
  return 0;
}
 

Комментарии:

1. Вы понимаете, как числа со знаком представлены в двоичном формате, то есть дополняют два? Одним из способов было бы преобразовать положительное число в двоичное, а затем применить дополнение two, чтобы получить отрицательное представление. Похоже, вы или тот, кто написал код, возможно, уже думаете в этом направлении, на что ссылается неиспользуемая flippedNum переменная.

2. Вы просто пытаетесь отобразить то же самое число в двоичном формате, как если бы входные данные были положительными, но с a - перед ним?

3. нет. двоичный вывод должен быть положительной версией числа. Т.Е. -7 и 7 должны выводить одно и то же (7 в двоичном формате).

4. О, тогда это звучит так, как будто вам просто нужно добавить n = abs(n); . Не забудьте #include <math.h>

5. Это то, что я изначально собирался сделать, но это показалось слишком простым. вывод правильный, но у меня есть подозрительное чувство, что по какой-то причине он не пройдет GitHub autograder… В любом случае, спасибо за помощь! Я думаю, я напишу обратно, если это не разрешено.

Ответ №1:

 unsigned int n = (unsigned int ) atoi( argv[1] );
unsigned int binRep[N];
 

должно работать

но отрицательное число будет в представлении с двумя дополнениями.

Комментарии:

1. Ввод из командной строки должен быть действительным знаком int . Вот почему у меня возникли проблемы с этим в противном случае.

2. 1.) ввод из командной строки всегда char * равен 2.) atoi( argv[1] ) выдает int 3.) (unsigned int) преобразует этот вывод в unsigned int

3. не могли бы вы объяснить мне, почему это работает? Я хочу иметь возможность полностью понять и понять это.

4. двойки дополняют Википедию , и если у вас возникли проблемы с пониманием моего комментария, я бы порекомендовал «Язык программирования C»

5. Я прочитал статью в Вики и несколько других сообщений о переполнении стека. Я все еще не до конца понимаю это, и это кажется довольно важным. В любом случае, вы можете просто дать мне краткое изложение того, почему это работает?