#c #c99
Вопрос:
короткий верхний предел без знака равен 65535, и больше, чем это число, вращается, начиная с 0;
unsigned short a = 65535;
printf("%d", a);
a = 65535
unsigned short a = 65536;
printf("%d", a);
a = 0
unsigned short a = 65537;
printf("%d", a);
a = 1
и т.д.
но… при объявлении с вычислением (pow, умножение, сложение и т.д.) число не переходит верхний предел.
unsigned short a = pow(2, 16) - 1;
printf("%d", a);
a = 65535
unsigned short a = pow(2, 16);
printf("%d", a);
a = 65535
unsigned short a = pow(2, 17);
printf("%d", a);
a = 65535
… и т.д.
В чем причина такой ситуации?
Комментарии:
1. @Cheatah здесь проблема не в этом. Большинство современных компиляторов даже с -O0 вообще не будут вызывать pow.
Ответ №1:
- Используйте правильный спецификатор формата, если вы хотите печатать значения без знака:
printf("%hu", a);
unsigned short a = pow(2, 16);
значение 65536 (или больше) не соответствуетunsigned short
. Для каждой команды @JohnBollinger назначение плавающего значения вне диапазона не определено, и два разных компилятора или даже один и тот же в зависимости от уровня оптимизации или других параметров могут давать разные результаты:
https://godbolt.org/z/TG9z8xhaG
gcc - 65535
clang - 0