strtoull и длинная длинная арифметика
-
22-07-2019 - |
Вопрос
Может кто-нибудь объяснить выход этой программы и как я могу это исправить?
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