Тот факт, что вы присваиваете результат int64_t
, не имеет значения. Все, что имеет значение, это то, что при умножении двух значений типа int
результат также имеет тип int
. Поскольку все 1024, 1024, 1024 и 4 являются константами типа int
, результирующий временный продукт вычисляется как int
, который переполняется.
Решение состоит в том, чтобы сделать по крайней мере одну из этих констант int64_t
. Произведение int64_t
с int
является int64_t
, поэтому 64-битная скорость будет каскадно распространяться на весь продукт. Вы можете сделать это либо с явным приведением, либо с целочисленным суффиксом :
int64_t y = (int64_t)1024 * 1024 * 1024 * 4; // explicit cast
int64_t y = 1024ll * 1024 * 1024 * 4; // integer suffix 'll'
Суффикс ll
(или эквивалентно LL
) после целочисленной константы говорит: «Это значение действительно long long
». Также существует суффикс ull
(или ULL
), который используется для unsigned long long
. Также обратите внимание, что стандарт языка C гарантирует, что значение long long
не менее 64 бит.