2014-01-21 3 views
6

Я пытаюсь понять, как работает putchar('0' + r);. Ниже функция принимает целое число и преобразует его в двоичный.Что делает putchar ('0' + num); делать?

void to_binary(unsigned long n) 
{ 
    int r; 
    r = n % 2; 
    if (n >= 2) 
     to_binary(n/2); 
    putchar('0' + r); 
} 

Я Google определение putchar, но я не нашел это. Чтобы проверить это, я добавил Printf, чтобы увидеть значение R:

void to_binary(unsigned long n) 
{ 
    int r; 
    r = n % 2; 
    if (n >= 2) 
     to_binary(n/2); 
    printf("r = %d and putchar printed ", r); 
    putchar('0' + r); 
    printf("\n"); 
} 

и я бегу он (набрал 5) и получил этот результат:

г = 1 и putchar напечатаны 1
г = 0 и putchar распечатаны 0
R = 1 и putchar распечатаны 1

Итак, я полагаю, что putchar('0' + r); печатает 0, если r = 0, иначе печатает 1, если r = 1, или что-то еще происходит?

+2

+1 для усилий – yaylitzis

ответ

6

В C '0' + digit - это дешевый способ преобразования однозначного целого в его символьное представление, например ASCII или EBCDIC. Например, если вы используете ASCII, подумайте об этом, добавив 0x30 ('0') к цифре.

Одно из предположений состоит в том, что кодировка символов имеет смежную область для цифр, которая сохраняется как для ASCII, так и для EBCDIC.


Как указано в комментариях, это свойство требуется как стандартами C++, так и C. Стандарт C говорит:

5.2.1 - 3

В обеих основных наборах символов источника и выполнения, значение каждый символ после 0 в приведенном выше списке десятичных цифр должно быть один больше, чем значение предыдущего.

+1

«Единственное предположение .. "на самом деле * требуется *: http://stackoverflow.com/questions/9416926/are-the-character-digits-0-9-required-to-have-contiguous-numeric-values ​​ – usr2564301

+0

@Jongware Спасибо. Я добавил цитату для стандарта C - я не знал, имел ли это C++. – cnicutar

+0

Однако имейте в виду, что если вы пишете анализатор файлов или сетевых потоков, который должен работать из определенного набора символов, вы должны его кодировать по числовым значениям, найденным в этом наборе символов, просто чтобы понять это (также кому-то чтение кода). – datenwolf

3

'0' представляет собой целое число, равное 48 в десятичной системе и является ASCII-код символа 0 (ноль). Код ASCII для символа для 1 составляет 49 в десятичной системе.

'0' + r такое же, как 48 + r. Когда r = 0, выражение оценивается до 48, поэтому выводится 0. С другой стороны, когда r = 1, выражение оценивается до 49, поэтому выводится 1. Другими словами, '0' + 1 == '1'

В принципе, это прекрасный способ легко преобразовать десятичные цифры в их представления символов ASCII. Она также работает с алфавитом (т.е. 'A' + 2 такое же, как C)

+0

Часть о '' A '+ n' не всегда верна для систем EBCDIC ... См. Ответ cnicutar. –

+0

Действительно, стандарт не применяет «A» + n', даже с нижним пределом (например, для того, чтобы сделать его обязательным для первых шести букв). * * * Работать в ASCII для всех неактивных латинских букв и в EBCDIC для A до I (что позволяет легко преобразовать шестнадцатеричное число), но кодировка может существовать без такой черты. – Medinoc

2

Это общий метод, используемый для передачи char.

char a = '0' + r (r in [0,9]) преобразует целое число в его формат символов, основанный на заданной базе оснований (т.'0' в данном случае), вы получите '0'...'9'

Аналогично, char a = 'a' + r или char a = 'A' + r (г в [0,25]) преобразует целое число в его формате полукокса, вы получите 'a'...'z' или 'A'...'Z' (за исключением EBCDIC systems, который имеет прерывистая область для алфавитов).


Edit:

  1. Вы также можете сделать наоборот, например:

    char myChar = 'c'; 
    int b = myChar - 'a'; // b will be 2 
    
  2. Похожая идея используется для преобразования строчной символ в верхний регистр:

    char myChar = 'c'; 
    char newChar = myChar - 'a' + 'A'; // newChar will be 'C' 
    
+0

Часть о ''A' + n' и коды символов для алфавита вообще не всегда верны для систем EBCDIC ... См. Ответ cnicutar. –

+1

@ChronoKitsune Обновлено. Спасибо, что указали это. – herohuyongtao

0

U добавляют значение ASCII из сказать '0' значение ASCII этого числа 48

'1' -> 49, и так далее CHECK HERE FOR COMPLETE TABLE

так, когда и добавьте 48 его будет 49 и putchar functuion печатает символ, отправленный ему. когда и делает

putchar('0' + r) 

, если г = 1 putchar (48 + 1), (преобразования в значение ASCII)

putchar (49), который является 1

Смежные вопросы