1

Двоичное число хранится в символьном массиве num2and1 , хранится вот это значение:110000110001

Хочу засунуть его переменную типа int и потом перевести число в десятичное , а из него уже и в ASCII символ,а потом полученный символ записать в файл

Для этого использую код из книги K&R

long  n;   
        n = 0;    
        for (i = 0; num2and1[i] >= '0' && num2and1[i] <= '9'; ++i)    
            n = 10 * n + (num2and1[i] - '0');   
        printf("%d", n);

Но на выходе такое -1669039695.Как же всё-таки правильно перенести эти символы цифр 1 и 0 в int? И почему в Си нет двоичного представления чисел ?

Elvin
  • 1,802
  • 1
    "Но на выходе такое -1669039695." - а какое должно? Видно же, что это код для десятичной записи, диапазон цифр от '0' до '9' ясно на это указывает. –  Mar 15 '18 at 18:46
  • @Igor, а разве не должны быть те же единички и нулики , но уже как цифры , а не символы ?(в исходном порядке) – Elvin Mar 15 '18 at 18:48
  • Не понял последний комментарий. –  Mar 15 '18 at 18:48
  • @Igor, это не исправит положение ? num2and1[i] >= '0' && num2and1[i] <= '1' – Elvin Mar 15 '18 at 18:50
  • Код, который Вы привели, преoбразует (пытается преобразовать) строку с числом "сто десять миллиардов сто десять тысяч один" в целое число. Число, конечно, в int не помещается, заворачивается вокруг максимального значения много раз и дает в результате мусор. –  Mar 15 '18 at 18:51
  • https://ru.stackoverflow.com/a/453060/178988 – Qwertiy Mar 15 '18 at 19:20

2 Answers2

3

Во-первых, код перевода записи числа в само число у вас приведен для перевода из десятичной записи. А вы, очевидно, хотите переводить из двоичной. Для перевода из двоичной записи он будет выглядеть примерно так

const char *num2and1 = "110000110001";

long n = 0;    
for (unsigned i = 0; num2and1[i] >= '0' && num2and1[i] <= '1'; ++i)    
  n = 2 * n + (num2and1[i] - '0');   

printf("%ld", n);

Во-вторых, выписывать все это руками нет никакого смысла, когда есть готовая функция перевода strtol в стандартной библиотеке

const char *num2and1 = "110000110001";

long n = strtol(num2and1, NULL, 2);

printf("%ld", n);

Для печати значения типа long нужен спецификатор формата %ld, а не %d.

В-третьих, что такое "а из него уже и в ASCII символ" - не ясно. В данном примере двоичная запись соответствует числу 3121. Где тут "ASCII символ"?

  • "это же единица"??? Ничего не понятно. – AnT stands with Russia Mar 15 '18 at 19:01
  • printf("%c",3121); выводит единицу – Elvin Mar 15 '18 at 19:02
  • Прекрасно. Но printf("%c",3121); выводит символ с кодом (unsigned char) 3121. К исходному 3121 это никакого отношения не имеет. – AnT stands with Russia Mar 15 '18 at 19:03
  • ,что тогда за единицу выводит мне компилятор ? – Elvin Mar 15 '18 at 19:06
  • и как записать в файл его (3121) символьный эквивалент ? – Elvin Mar 15 '18 at 19:10
  • @Elvin: одно и то же число может разным символам (и даже нескольким символам одновременно) соответствовать в зависимости от кодировки. В ascii это переводится как FF 1 (FORM FEED символ, за которым символ единицы идёт). – jfs Mar 15 '18 at 19:49