каково значение многосимвольной символьной константы - PullRequest
0 голосов
/ 02 июля 2018

Я знаю многосимвольную символьную константу, указанную как int. и я знаю, что его значение зависит от компилятора. но мой вопрос: когда я сохраняю многосимвольную символьную константу в переменной char, она будет вести себя по-другому.

#include <iostream>

int main() {
    std::cout << 'asb';
    return 0;
}

выход: 6386530


#include <iostream>

int main() {
    char a = 'asb';
    std::cout << a;
    return 0;   
}

вывод: b

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Случай 1: Вы получаете 'a'*256²+'s'*256+'b' = 6386530 потому что 'a' = 97, 's' = 115, 'b' = 98

ср. Ascii стол

'asb' интерпретируется как целое число.

typeid('asb').name()[0] == 'i' && sizeof('asd') == 4;

Целое число составляет 32 бита, и вы можете хранить «asb» (24 бита) в виде целого числа. Вот почему std :: cout интерпретирует его как целое число и отображает 6386530

Обратите внимание, что также:

  typeid('xxxxabcd').name()[0] == 'i' && sizeof('xxxxabcd') == 4;

но xxxxabcd представлен 64-битными, поэтому 32-битные теряются.

std::cout << 'xxxxabcd';
std::cout << 'abcd';

напечатал бы то же самое.


Случай 2: «asb» интерпретируется как целое число, и вы преобразуете его в символ (8 бит). Как указал @BenjaminJones, сохраняются только последние 8 бит (98 == 'b'). И std :: cout интерпретирует его как символ, поэтому он отображает 'b'.


В любом случае, оба случая вызывают предупреждение компиляции, например:

warning: multi-character character constant [-Wmultichar] 
warning: multi-character character constant [-Wmultichar] In function 'int main()'
warning: overflow in implicit constant conversion [-Woverflow]

Полагаю, поведение зависит от компилятора.

0 голосов
/ 02 июля 2018

Во втором примере литерал - это int, который преобразуется в символ. Поэтому здесь есть несколько проблем, связанных с реализацией:

  • Интерпретация многосимвольного литерала
  • Является ли символ подписанным или без знака
  • Преобразование из int в подписанный символ (если char подписан)

Похоже, что происходит то, что 'asb' интерпретируется как 6386530, а затем усекается в соответствии с правилами для преобразования из int в неподписанный символ . Другими словами, 6386530% 256 == 97 == 'b'.

0 голосов
/ 02 июля 2018

Вы не сохраняете значение константы с несколькими символами как есть. Вы конвертируете значение в другое значение, которое находится в диапазоне char. Поскольку вы также печатаете значение с помощью совершенно разных перегрузок operator<< (один для char вместо одного для int), очевидно, что выход будет иным из-за этого.

...