Может ли кто-нибудь объяснить вывод этой программы и как я могу ее исправить?strtoull и длинная длинная арифметика
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
Может ли кто-нибудь объяснить вывод этой программы и как я могу ее исправить?strtoull и длинная длинная арифметика
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
ли вы <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
вручную вставленные подчёркивания ...
Ах, это имеет смысл. В отсутствие объявления для 'strtoll' он рассматривается как' int strtoll() ', поэтому то, что заканчивается на' ns', по существу не определено. –
Мне было любопытно, почему это так, поэтому я кое-что сделал. Оказывается, (int) strtoll (...) дает тот же результат, что и отсутствующий stdlib.h. C предполагает, что возвращаемое значение функции int по умолчанию, поэтому принимается только часть результата strtoll. – Arkadiy
@Pavel Minaev :) – Arkadiy
Почему бы не использовать strtoull, если вы хотите беззнаковый длинный длинный?
такая же вещь случается с strtoull – user105033
Я не могу объяснить поведение. Тем не менее, на 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
stdlib.h была причина ... – user105033
Отлично. Рад, что это помогло. –
Что ваше окружение? Я предполагаю, что длинный длинный 64 бит, не так ли? –
Да им на 64-битной машине – user105033
В моей среде (более или менее доступный сервер Ubuntu 7.04) он отлично работает. –