質問

誰でもこのプログラムの出力とその修正方法を説明できますか?

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

// 18446744073490980372
役に立ちましたか?

解決

<stdlib.h>が含まれていますか?

<=>を省略すると、MacOS Xで再現できます。

#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

手動でアンダースコアを挿入...

他のヒント

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

動作を説明できません。ただし、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:\Home> t.exe
123110724001300
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top