Как мне подтвердить диапазон длинных целых без знака в C?
Best , просто используйте макросы из <limits.h>
.Он лучше сам документирует намерения кода.
unsigned long long b_max = ULLONG_MAX;
В качестве альтернативы присвойте -1 типу unsigned .Поскольку -1 не входит в диапазон типа unsigned , он будет преобразован в целевой тип путем добавления значения MAX этого типа плюс 1. Работает даже на редких машинах с отступом.
... если новый тип без знака, значение преобразуется путем многократного сложения или вычитания значения, превышающего максимальное значение, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне новоготип.C11dr §6.3.1.3 2
Минимальные значения, конечно, 0 для типа без знака .
unsigned long long b_min = 0;
unsigned long long b_max = -1;
printf("unsigned long long range [%llu %llu]\n", b_min, b_max);
Обратите внимание, что разборчивые компиляторы будут жаловаться на назначениезначение вне диапазона с b_max = -1;
.Используйте ULLONG_MAX
.
Где я сделал не так?
Предупреждение "предупреждение: целочисленная константа настолько велика, что она без знака" обусловлена тем, что 18446744073709551615
является целочисленной десятичной константой вне диапазона long long
на вашей платформе.Неокрашенные десятичные константы ограничены этим.Добавить U
или u
.Тогда компилятор рассмотрит unsigned long long
.
unsigned long long b = 18446744073709551615u;
Кроме того, нет спецификации C, в которой говорится, что 18446744073709551615 является максимальным значением unsigned long long
.Это должно быть минимум .Это может быть больше.Таким образом, присвоение b = 18446744073709551615u
может не присвоить значение max .
Как изменить код?
Показано выше