Инициализация значения от подписанного символа до целого, преждевременное продвижение? - PullRequest
3 голосов
/ 05 мая 2019

В этом куске кода:

signed char v = -64;
int n = 4;
int x = v - '0' * (signed char)n;
std::cout << x << std::endl;

Должно ли x быть -5 или -261? В моем понимании выражение инициализатора имеет тип signed char, и преобразование типа должно произойти позже, после того, как инициализатор вычислен.

Итак, v - '0' * (signed char)n должно быть равно -5, потому что это эквивалентно -261 в оценке signed char.

Однако этот фрагмент кода печатает -261.

Ответы [ 2 ]

5 голосов
/ 05 мая 2019

char s и short s повышаются до int при выполнении арифметики. Приведение (signed char)n не помогает, поскольку результат немедленно повышается до int для умножения.

Вот неявные преобразования, сделанные явно:

int x = (int)v - (int)'0' * (int)(signed char)n;
3 голосов
/ 05 мая 2019

Выражение v - '0' * (signed char)n сгруппировано как v - ('0' * (signed char)n)

Оба аргумента '0' и (signed char)n преобразуются в int типы до умножения. Вы ничего не можете сделать, чтобы остановить это.

Эта сумма вычитается из v, которая также повышается до int.

Это дает -261 на платформе с кодировкой ASCII.

...