в чем причина различий в объявлении этих переменных данных в C

#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:

  1. Используйте правильный спецификатор формата, если вы хотите печатать значения без знака:
 printf("%hu", a);
 
  1. unsigned short a = pow(2, 16); значение 65536 (или больше) не соответствует unsigned short . Для каждой команды @JohnBollinger назначение плавающего значения вне диапазона не определено, и два разных компилятора или даже один и тот же в зависимости от уровня оптимизации или других параметров могут давать разные результаты:

https://godbolt.org/z/TG9z8xhaG

 gcc - 65535
clang - 0