#c #character-encoding #char #ascii #ebcdic
Вопрос:
main() {
char c1='a' , c2='A';
int i=c2-c1;
printf("%d", i);
}
Каков вывод этого кода.
Пожалуйста, объясните, почему?
Я знаю, что ответ -32, но может ли кто-нибудь объяснить, почему это -32?
Комментарии:
1. В этом разница между строчной буквой и ее эквивалентом в верхнем регистре в таблице ASCII .
2. Я получаю ответ 64 на своем компьютере EBCDICBFG2000. Так что, строго говоря, результат не гарантирован. Хотя на практике большинство людей используют компьютеры с ASCII или UTF8.
3. Как вы думаете, каким должен быть ответ? И почему так?
Ответ №1:
Каждый ascii char
хранится в виде числа между 0
и 127
включительно, глядя на таблицу ascii, вы можете видеть, что a
хранится как 97
, пока A
хранится как 65
.
То, что вы делаете, — это вычитание a
, A
а затем печать как integer
.
Следовательно, почему результат таков 65-97=-32
Комментарии:
1. В своем ответе вы написали:
"Every char is stored as a number between 0 and 127 inclusive"
. Это не совсем правильно. На большинстве платформ тип данныхchar
подписан и может хранить значения между-128
до127
. Однако на некоторых платформахchar
не имеет знака и допускает значения между0
и255
. Оба варианта разрешены стандартом ISO C. ASCII стандартизирует только первые127
символы, но символы128
to255
все равно можно использовать для других символов. Значение этих символов обычно зависит от используемой в данный момент кодовой страницы.2. И еще на других платформах,
char
имеет еще более широкий диапазон.3. @AndreasWenzel вы правы, я написал ответ довольно поспешно во время обеденного перерыва. Я добавил небольшое изменение, чтобы уточнить
every ascii char
, чтобы быть более точным
Ответ №2:
пожалуйста, объясните, почему вывод кода равен -32?
Это связано с тем, что используемый компилятор использует набор символов кодировки ASCII, в котором коды прописных букв меньше, чем коды соответствующих строчных букв 32
.
Вот демонстрационная программа.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
for ( char upper_case = 'A'; upper_case <= 'Z'; upper_case )
{
char lower_case = tolower( ( unsigned char )upper_case );
printf( "%c = %d, %c = %d, %c - %c = %dn",
upper_case, upper_case, lower_case, lower_case,
upper_case, lower_case,
upper_case - lower_case );
}
return 0;
}
Его выход составляет
A = 65, a = 97, A - a = -32
B = 66, b = 98, B - b = -32
C = 67, c = 99, C - c = -32
D = 68, d = 100, D - d = -32
E = 69, e = 101, E - e = -32
F = 70, f = 102, F - f = -32
G = 71, g = 103, G - g = -32
H = 72, h = 104, H - h = -32
I = 73, i = 105, I - i = -32
J = 74, j = 106, J - j = -32
K = 75, k = 107, K - k = -32
L = 76, l = 108, L - l = -32
M = 77, m = 109, M - m = -32
N = 78, n = 110, N - n = -32
O = 79, o = 111, O - o = -32
P = 80, p = 112, P - p = -32
Q = 81, q = 113, Q - q = -32
R = 82, r = 114, R - r = -32
S = 83, s = 115, S - s = -32
T = 84, t = 116, T - t = -32
U = 85, u = 117, U - u = -32
V = 86, v = 118, V - v = -32
W = 87, w = 119, W - w = -32
X = 88, x = 120, X - x = -32
Y = 89, y = 121, Y - y = -32
Z = 90, z = 122, Z - z = -32
Если ваш компилятор будет использовать набор символов кодировки EBCDIC, то разница между кодами прописных букв и соответствующими строчными буквами равна 64
.
Я знаю, что ответ -32, но
Ответ зависит от используемого набора символов кодировки. Это может быть, например, равно -32
или -64
.:)