Windows (MSVC8 & MSVC6) で __int64 を long に変換する方法は?
通常の型キャストは機能しますか?
また、long を __int64 に変換するのはどうでしょうか。long が負の値の場合、機能しますか?
注 - __int64 変数に常に 32 ビットを超えない値が含まれるシナリオについて話しています。
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
__int64
signed __int64
2.__int64をlongに変換します
データが失われる可能性がある場合にのみ、に変換__int64
してlong
も問題ありません。私のmsvc8は、データが失われる可能性があることを警告するだけです。
3.注:
int64_t
C99は、で名前付きおよび符号なしバージョンuint64_t
の標準64ビット整数型を定義しましたstdint.h
。ポータブルコードを提供する場合は、それらを使用する必要がありますが、使用しないでください__int64
。
C ++プログラミング言語には標準の64ビット整数型がないことに注意してください。MSVCを__int64
使用しますが、Linuxの世界では通常使用するint64_t
か、C99としてまたはC99でuint64_t
定義された型です。ここでは、C++コンパイラがヘッダーファイルをサポートしていると仮定します。long long
unsigned long long
stdint.h
stdint.h
はい、__int64 値が常に long の範囲内にあることを保証できる限り、型キャストは問題ありません。他の方向、つまり long から __int64 へのキャストは、関連する値に関係なく問題になりません。
ここに小さなテストがあります。でコンパイルされた場合、警告を回避するには、明示的なキャストが必要/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
32 ビット値は、符号付きまたは符号なしで問題なく 64 ビット変数に割り当てることができます。64 ビット値を 32 ビット変数に代入することはできますが、値を格納するために 32 ビット以上が必要な場合は、より小さい変数に収まるように切り捨てられるため、データが失われる可能性があります。