Short int в printf хранит значение вне диапазона - PullRequest
0 голосов
/ 13 января 2020

Почему можно хранить -32 768 как короткое int?

printf("%hd", -32768);
//returns -32768, no compiler errors

printf("%hd", (short int)-32768);
//returns -32768, no compiler errors

short int a = -32768;
printf("%hd", a);
//returns -32768, no compiler errors

printf("%d", -2147483648);
//compiler returned error as it should

И почему переполнение short int не вызывает ошибку в компиляторе?

printf("%hd", -32769);
//returns 32767, no compiler errors

, а

printf("%d", -2147483648);
//compiler returned error

Я использую 64-разрядную версию Ubuntu 16.04 с компилятором g cc версии 5.4.0. Это как-то связано с функцией printf? или я чего-то не понимаю.

1 Ответ

1 голос
/ 14 января 2020

Нет ничего волшебного c в передаче этих значений printf. Помните, его прототип - int printf(const char*, ...). Когда числовой аргумент c, который меньше int, передается через многоточие (... в конце списка аргументов), он переводится в int. Таким образом, printf ожидает, что все значения, типы которых меньше, чем int, будут переданы как int.

Однако в этом случае интегральные продвижения отсутствуют. Тип -32768 является int. То же самое для -32769. Это зависит от кода внутри printf, чтобы применить спецификатор формата (здесь "%hd") и попытаться найти смысл в значениях, которые ему передаются. Этот код передает целочисленные значения и утверждает, что их тип short. Похоже, что это работает, но, в общем, не ожидайте от этого смысла.

Относительно (short)-32768, если это значение соответствует короткому (что, вероятно, и делает; проверьте SHORT_MIN, чтобы выяснить, ), нет проблем. Если нет, результат преобразования определяется реализацией; это не незаконно.

И, наконец, -32769 имеет тип int; переполнения нет, и результат, который вы видите, - это просто код форматирования, пытающийся разобраться в битовом шаблоне, исходя из предположения, что значение, которое он видит, является результатом повышения от short до int. Опять же, не ожидайте от этого смысла.

...