strtoull and long long arithmetic

前端 未结 3 1707
日久生厌
日久生厌 2020-12-11 10:42

Can anyone explain the output of this program and how I can fix it?

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


        
相关标签:
3条回答
  • 2020-12-11 10:45

    Do you have <stdlib.h> included?

    I can reproduce on MacOS X if I omit <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);
    }
    

    Omit the header, I get your result. Include the header, I get the correct answer.

    Both 32-bit and 64-bit compiles.


    As noted in the comments, in the absence of a declaration for strtoll(), the compiler treats it as a function returning int.

    To see more of what goes on, look at the hex outputs:

         123110724001300    0x00006FF7_F2F8DE14    Correct
    18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect
    

    Manually inserted underscores...

    0 讨论(0)
  • 2020-12-11 10:53

    I cannot explain the behavior. However, on 32 bit Windows XP with 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;
    }
    

    prints

    E:\Home> t.exe
    123110724001300
    
    0 讨论(0)
  • 2020-12-11 11:06

    Why not use strtoull if you want an unsigned long long?

    0 讨论(0)
提交回复
热议问题