Я хочу преобразовать значение char
в int
. Я играю со следующими фрагментами кода:
#include <iostream>
using namespace std;
int main() {
char a = 'A';
int i = (int)a;
//cout<<i<<endl; OUTPUT is 65 (True)
char b = '18';
int j = b;
//cout<<j<<endl; OUTPUT is 56 (HOW?)
char c = 18;
int k = c;
//cout<<c<<endl; OUTPUT is empty
//cout<<k<<endl; OUTPUT is 18 (Is this a valid conversion?)
return 0;
}
Я хочу третье преобразование, и я получил правильный результат, т.е. 18
. Но является ли это правильной конверсией? Может кто-нибудь объяснить приведенные выше результаты и их стратегии?
char a = 'A';
int i = (int)a;
Бросок не нужен. Присвоение или инициализация объекта числового типа значением любого другого числового типа вызывает неявное преобразование.
Значение, хранящееся в i
представляет собой значение, которое ваша реализация использует для представления символа 'A'
. Почти во всех системах в наши дни (за исключением некоторых мэйнфреймов IBM и, возможно, нескольких других) это значение составит 65
.
char b = '18';
int j = b;
Литеральный символ с более чем одним символом имеет тип int
и имеет значение, определенное реализацией. Вероятно, что значение будет '1'<<8+'8'
и что преобразование из char
в int
'1'<<8+'8'
старших бит, оставив '8'
или 56
. Но многосимвольные литералы - это то, чего следует избегать. (Это не относится к escape-последовательностям, таким как '\n'
, хотя между одинарными кавычками есть два символа, он представляет одно знаковое значение.)
char c = 18;
int k = c;
char
- целочисленный тип; он может легко удерживать целое значение 18
. Преобразование этого значения в int
просто сохраняет значение. Таким образом, оба c
и k
являются целыми переменными, значение которых равно 18
. Печать k
использованием
std::cout << k << "\n";
будет печатать 18
, но печать c
с использованием:
std::cout << c << "\n";
будет печатать непечатаемый управляющий символ (это, случается, Control-R).
char b = '18';
int j = b;
b, в этом случае символ "18" не имеет очень последовательного значения и имеет поведение, зависящее от реализации. В вашем случае он, похоже, переводится в значение ascii 56 (что эквивалентно тому, что вы получите от char b = '8').
char c = 18;
int k = c;
c хранит значение символа 18, и оно совершенно верно для преобразования в int. Однако он может не отображаться очень сильно, если вы показываете его как символ. Это непечатаемый управляющий символ.
'18'
имеет типint
и имеет значение, определяемое реализацией. Это значение преобразуется изint
вchar
, что можетint
к потере информации.