strtoullおよびlong long算術
-
22-07-2019 - |
質問
誰でもこのプログラムの出力とその修正方法を説明できますか?
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
所属していません StackOverflow