2

このプログラムの出力と修正方法を説明できる人はいますか?

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

// 18446744073490980372
4

3 に答える 3

11

含まれて<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 を返す関数として扱います。

何が起こっているのかをもっと見るには、16 進数の出力を見てください。

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect

手動で挿入されたアンダースコア...

于 2009-10-29T19:45:32.993 に答える
3

unsigned long long が必要な場合は、なぜ strtoull を使用しないのですか?

于 2009-10-29T19:40:45.520 に答える
1

振る舞いを説明することはできません。ただし、Cygwin を使用する 32 ビット Windows XP では、次のようになります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:\ホーム > t.exe
123110724001300
于 2009-10-29T19:42:37.077 に答える