strtoull e longo longo aritmética
-
22-07-2019 - |
Pergunta
Alguém pode explicar a saída deste programa e como posso corrigir isso?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
Solução
Você tem <stdlib.h>
incluído?
Eu posso reproduzir em MacOS X se eu omitir <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);
}
omitir o cabeçalho, eu obter o resultado. Incluir o cabeçalho, eu recebo a resposta correta.
As duas compilações de 32 bits e de 64 bits.
Como observado nos comentários, na ausência de uma declaração para strtoll (), os compilador trata-lo como um int retornando função.
Para ver mais do que se passa, olhar para as saídas Hex:
123110724001300 0x00006FF7_F2F8DE14 Correct
18446744073490980372 0xFFFFFFFF_F2F8DE14 Incorrect
manualmente inserida sublinhados ...
Outras dicas
Por que não usar strtoull se você quiser um unsigned long long?
Eu não posso explicar o comportamento. No entanto, em 32 bits do Windows XP com o 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;
}
impressões
E:\Home> t.exe 123110724001300