3

Windows (MSVC8 & MSVC6) で __int64 を long に変換する方法は?

通常の型キャストは機能しますか?

また、long を __int64 に変換するのはどうでしょうか。long が負の値の場合、機能しますか?

注 - __int64 変数に常に 32 ビットを超えない値が含まれるシナリオについて話しています。

4

4 に答える 4

5

1.longを__int64に変換します

キーワードに関するMSDNによると__int64

_ _int64キーワードは、64ビット(8バイト)整数の新しい型を宣言します。int、short、およびlong型と同様に、_ _int64型には対応する符号なしバージョンがあるため、実際には__int64キーワードを使用して2つの型を作成できます。

次のコードサンプルは、2つの64ビット整数を宣言する方法を示しています。1つは符号付き、もう1つは符号なしです。

__int64signed_big_int; unsigned __int64 unsigned_big_int;

__int64は署名されており、よりも幅が広い必要があります。したがって、型キャストがなくても、もちろんサポートが負の長さである場合でもlong割り当てることができます。long__int64signed __int64

2.__int64をlongに変換します

データが失われる可能性がある場合にのみ、に変換__int64してlongも問題ありません。私のmsvc8は、データが失われる可能性があることを警告するだけです。

3.注

int64_tC99は、で名前付きおよび符号なしバージョンuint64_tの標準64ビット整数型を定義しましたstdint.h。ポータブルコードを提供する場合は、それらを使用する必要がありますが、使用しないでください__int64

C ++プログラミング言語には標準の64ビット整数型がないことに注意してください。MSVCを__int64使用しますが、Linuxの世界では通常使用するint64_tか、C99としてまたはC99でuint64_t定義された型です。ここでは、C++コンパイラがヘッダーファイルをサポートしていると仮定します。long longunsigned long longstdint.hstdint.h

于 2010-02-08T12:49:22.813 に答える
3

はい、__int64 値が常に long の範囲内にあることを保証できる限り、型キャストは問題ありません。他の方向、つまり long から __int64 へのキャストは、関連する値に関係なく問題になりません。

于 2010-02-08T12:32:21.087 に答える
2

ここに小さなテストがあります。でコンパイルされた場合、警告を回避するには、明示的なキャストが必要/W3です。

#include <limits.h>


int main( int argc, char *argv[] )
{
    __int64 i64;
    long i;

    i64 = -1;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = INT_MAX;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = INT_MIN;
    i = (long)i64;
    printf( "i=%d\n", i );

    i64 = i;
    printf( "i64=%I64d\n", i64 );
}

出力は次のとおりです。

i=-1
i=2147483647
i=-2147483648
i64=-2147483648
于 2010-02-08T14:08:30.747 に答える
0

32 ビット値は、符号付きまたは符号なしで問題なく 64 ビット変数に割り当てることができます。64 ビット値を 32 ビット変数に代入することはできますが、値を格納するために 32 ビット以上が必要な場合は、より小さい変数に収まるように切り捨てられるため、データが失われる可能性があります。

于 2013-09-07T21:11:42.333 に答える