0

私は以下のコードを実装しました:

#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_tlong intであり、longlongintではありません。

私の質問は、64ビットマシンの精度を失うことなく、長い長い戻り値をint64_tに割り当てるための回避策/解決策はありますか?

前もって感謝します

4

3 に答える 3

7

損失は​​変換ではなく印刷で発生します。

printf("i64value1 : [%d]\n",i64value1);

int64_t引数は、のようにアクセスされますint。これは未定義の動作ですが、通常、下位32ビットは符号拡張されます。

適切なコンパイラ警告(gccなど-Wformat)はこれについて文句を言うはずです。

于 2012-08-08T10:47:38.470 に答える
1

ジルは正しい。

私が信じている使用法はstd::cout <<それを正しい方法で処理するか、printf("i64value2 : [%lld]\n",i64value2);印刷中に使用することで解決するはずです。

于 2012-08-08T12:33:32.607 に答える
-1

x86-64 ABIでは、64ビット値とlong long同じです。longこの場合、精度の低下はありません。

于 2012-08-08T10:43:15.897 に答える