Если не указано иное, целочисленные литералы имеют тип int
. Я бы предположил, что на вашей платформе int
является 32-битным. Таким образом, расчет (64*33554432)
переполняется и становится отрицательным. Затем вы приводите это значение к unsigned __int64
, так что теперь оно возвращается к очень очень большому положительному целому числу.
Вуаля:
int main()
{
int a1 = (64*33554432);
int a2 = (63*33554432);
printf("%08x\n", a1); // 80000000 (negative)
printf("%08x\n", a2); // 7e000000 (positive)
unsigned __int64 b1 = a1;
unsigned __int64 b2 = a2;
printf("%016llx\n", b1); // ffffffff80000000
printf("%016llx\n", b2); // 000000007e000000
}