2015-06-04 3 views
1

Может быть, я собираюсь задать глупый вопрос, но я хочу подтвердить, что работает char? Позвольте мне объяснить с примерами, что я хочу спросить. Предположим, я объявляю char variable, а затем input 6 или любой целочисленный символ.Как char и int работают в C++

#include <iostream> 
using namespace std; 
int main(){ 
    char a; 
    cin >> a; 
    cout << a*a; // I know here input's ASCII value will multiply 
    return 0; 
} 

То же, что для целых input 6

#include <iostream> 
using namespace std; 
int main(){ 
    int a; 
    cin >> a; 
    cout << a*a; // Why compiler not take input's ASCII Value here? 
    return 0; 
} 

Я думаю, что теперь мой вопрос ясен.

+3

* Я знаю, что двоичный код ввода будет умножаться * что вы подразумеваете под этим? – Borgleader

+1

Можете ли вы попытаться объяснить, что вы просите еще немного? –

+0

_ «Я думаю, теперь мой вопрос ясен». По существу, вы спрашиваете об обратном [«uint8_t не может быть напечатан с помощью cout»] (http://stackoverflow.com/questions/19562103/uint8-t-cant-be-printed-with-cout/19562163# 19562163), прикладывание может быть применено. –

ответ

3

char является фундаментальным типом данных размером 1 байт (не обязательно 8 бит !!!), который способен отображать как минимум ASCII code range всех символов. Так, например, char x = 'a'; действительно сохраняет значение ASCII 'a', в этом случае 97. Однако операторы ostream перегружены, поэтому они «знают», как обращаться с char, и вместо слепого отображения 97 в строке, такой как cout << x;, они отображают ASCII-представление символа, то есть 'a'.

Однако всякий раз, когда вы делаете a * a, компилятор выполняет то, что называется integral promotion, и неявно преобразует данные в char к int. Итак, для компилятора выражение a * a переведено на (int)a * (int)a, что является результатом 97 * 97, поэтому вы в конечном итоге показываете 9409.

Обратите внимание, что для компилятора char и int - два разных типа. Он может различать два. Таким образом, operator<< отображает символ только тогда, когда вход имеет тип char или тип, неявно конвертируемый в char.

+0

Я уже знаю этот процесс. Но как компилятор обрабатывает char и int? Хранит ли компилятор в разных местах? Я действительно запутался между процессом char и int. Извините – UnKnown

+0

@AsifMushtaq см. Мое обновленное редактирование. – vsoftco

+0

Я получил полезную строку из вашей ссылки на интеграционную рекламу. ** В частности, арифметические операторы не принимают типы, меньшие, чем int в качестве аргументов ** Я думаю, теперь ясно, что арифметические операторы работают только с типами данных, которые больше или равным int. Компилятор автоматически использует значение ASCII для типов данных, меньших, чем int? – UnKnown

1

В случае char, это не бинарное, который умножается, это значение ASCII того, что вы набрали. В случае 6 значение ASCII является 54, так 2916 выводится. Когда a является int, 6 хранится непосредственно, поэтому выводится 36.

+0

Извините, я пишу по ошибке вместо ASCII .... -_- Но что вы подразумеваете под int, 6 магазин напрямую? – UnKnown

0

В случае Int считывает номер, который вы вводите в виде числового значения, а не его ASCII-значения. Поэтому вы можете ТОЛЬКО использовать числа для целых чисел, но char позволяет использовать любой символ (пример A, B, C, D | 1,2,3,4 |! #% ^) И использует его значение ASCII , Значение ASCII 4 равно 52, например, ASCII-значение A, * равно 65 и 42 соответственно. ПРИМЕЧАНИЕ: Капитальные буквы отличаются по сравнению с строчными буквами (пример S = 83, а наоборот s = 115).

Надеюсь, это помогло даже немного.

0

Это из-за неявное преобразование типа:

Неявных преобразования выполняются всякий раз, когда выражение некоторого типа Т1 используется в контексте, который не принимает этот типа, но принимает некоторый другого типа T2, в а именно:

Когда выражение используется в качестве операнда с оператором, который ожидает T2

В экзамена PLE

char a; 
cin >> a; 
cout << a*a;/

Оператор * рассчитывает интегральный тип, поэтому типа char неявно преобразуются в int, поэтому при преобразовании символа в целое, использование системы, соответствующее значение ASCII обугленного. Подробнее см. Здесь http://en.cppreference.com/w/cpp/language/implicit_cast