Вопрос

Может кто-нибудь объяснить выход этой программы и как я могу это исправить?

unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);

// 18446744073490980372
Это было полезно?

Решение

Есть ли у вас <stdlib.h>?

Я могу воспроизвести на MacOS X, если опущу <=>.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
    printf("%llu\n", ns);
    return(0);
}

Опусти заголовок, я получу твой результат. Включите заголовок, я получу правильный ответ.

И 32-битные, и 64-битные компиляции.

<Ч>

Как отмечалось в комментариях, при отсутствии объявления для strtoll () компилятор обрабатывает его как функцию, возвращающую int.

Чтобы увидеть больше того, что происходит, посмотрите на шестнадцатеричные выводы:

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect

Подчеркивание, вставленное вручную ...

Другие советы

Почему бы не использовать strtoull, если вы хотите использовать unsigned long long?

Я не могу объяснить поведение. Однако в 32-разрядной Windows XP с Cygwin gcc-4.3.2:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    unsigned long long ns = strtoull("123110724001300", NULL, 10);
    fprintf(stderr, "%llu\n", ns);
    return 0;
}

печатает

E:\Home> t.exe
123110724001300
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top