Вы получаете переполнение.Рассмотрим дублирование в шестнадцатеричном формате:
0xffffffff * 0xffffffff == 0xfffffffe00000001
^^^^^^^^
only the last 32 bits are returned
Решение состоит в том, чтобы использовать больший тип, например long long unsigned
:
long long unsigned int NUMBER = 4294967295ULL * 4294967295ULL;
Суффикс ULL
означает unsigned long long
.
Посмотрите, как работает онлайн: ideone