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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top