strtoull и длинная длинная арифметика - PullRequest
2 голосов
/ 29 октября 2009

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

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

// 18446744073490980372

Ответы [ 3 ]

11 голосов
/ 29 октября 2009

Есть ли у вас <stdlib.h> в комплекте?

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

#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

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

3 голосов
/ 29 октября 2009

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

1 голос
/ 29 октября 2009

Я не могу объяснить поведение. Однако на 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
...