Это результат преобразования вне диапазона.В этом случае делается попытка сохранить значение вне диапазона int
в int
.Поскольку int
подписано, преобразование происходит определенным способом реализации.
В системе, использующей представление отрицательных чисел в виде дополнения до двух, это обычно означает, что значение обтекает то, что вы видите здесь.
Компиляторы не обязаны предупреждать, когда что-то вродеэто случается, но они могут, если они решили.Например, gcc не будет предупреждать с помощью -Wall -Wextra
, но будет предупреждать с помощью -Wconversion
.
Это поведение описано в разделе 6.3.1.8 стандарта C относительно целочисленных преобразований:
1 Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.
2 В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания значения, превышающего максимальное значение, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне новоготип.
3 В противном случае новый тип подписывается и значение не может быть представлено в нем;либо результат определяется реализацией, либо определяется сигнал реализации.