このプログラムの出力と修正方法を説明できる人はいますか?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
このプログラムの出力と修正方法を説明できる人はいますか?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
含まれて<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
手動で挿入されたアンダースコア...
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:\ホーム > t.exe 123110724001300