Неожиданное поведение от unsigned_int64; - PullRequest
1 голос
/ 12 апреля 2011
unsigned__int64 difference;
difference=(64*33554432);
printf ("size %I64u \n", difference);
difference=(63*33554432);
printf ("size %I64u \n", difference);

первый # смехотворно велик.Второе число - правильный ответ.Как изменение с 62 на 63 вызывает такое изменение?

Первое значение - 18446744071562067968 Второе значение - 2113929216

К сожалению, значения были 64 и 63, а не 63 и 62.

Ответы [ 2 ]

9 голосов
/ 12 апреля 2011

Если не указано иное, целочисленные литералы имеют тип 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
}
0 голосов
/ 12 апреля 2011

На gcc работает нормально и выдает правильное число в обоих случаях.

размер 2113929216 размер 2080374784

Может ли это быть ошибкой в ​​printf? Вы используете MSVC или подобное? попробуйте пройти через отладчик и проверять разницу после каждой оценки. Если числа выглядят правильно, то это может быть просто проблема печати. Тем не менее, под GCC на Linux это правильно.

...