int64_t
ограничения не имеют значения в вашем примере, так как тип b
входит в игру только после , вычисляется выражение a * a
, и урон уже нанесен.
При выполнении арифметики выполняются «обычные арифметические преобразования», т. Е. Значения преобразуются в общий тип, который по крайней мере int
;в этом случае int32_t
, вероятно, уже является int
под капотом, поэтому два значения остаются без изменений, и выполняется 32-битное умножение. Это переполняет диапазон int32_t
, с результатом, который вы можете видеть (обратите внимание, что переполнение со знаком на самом деле неопределенное поведение).
Чтобы заставить его работать как задумано, вы должны сначала привести хотя бы один из операндовint64_t
, так что умножение выполняется в 64-битной арифметике.
int64_t b = ((int64_t)a) * a;