Нужно объяснение кода. Может кто-нибудь, пожалуйста, объяснить, почему вывод кода равен -32?

#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 to 255 все равно можно использовать для других символов. Значение этих символов обычно зависит от используемой в данный момент кодовой страницы.

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 .:)