私は以下のコードを実装しました:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<cstdlib>
#include<sys/types.h>
main()
{
int64_t i64value1 = 0;
int64_t i64value2 = 0;
long long llvalue = 0;
const char *s = "10811535359";
i64value1 = atoll(s);
llvalue = atoll(s);
i64value2 = llvalue;
printf("s : [%s]\n",s);
printf("i64value1 : [%d]\n",i64value1);
printf("llvalue : [%lld]\n",llvalue);
printf("i64value2 : [%d]\n",i64value2);
}
上記のプログラムの出力は次のとおりです。
s : [10811535359]
i64value1 : [-2073366529]
llvalue : [10811535359]
i64value2 : [-2073366529]
使用されるコンパイラは次のとおりです。
gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)
OSはx86_64GNU/Linux2.6.18-194です
long longは符号付き64ビット整数であり、すべての目的と目的でint64_t型と同じであるため、論理的にはint64_tとlonglongは同等の型である必要があります。また、一部の場所では、longlongの代わりにint64_tを使用することに言及しています。しかし、stdint.hを見ると、上記の動作が見られる理由がわかります。
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
64ビットコンパイルでは、int64_tはlong intであり、longlongintではありません。
私の質問は、64ビットマシンの精度を失うことなく、長い長い戻り値をint64_tに割り当てるための回避策/解決策はありますか?
前もって感謝します