Int64 値がありますが、下位 32 ビットのみが必要です。したがって、Int64 値の下位 32 ビットから Int32 値を取得する簡単な方法が必要です。
ありがとう
int64 値を int32 値に割り当てると、コンパイラは自動的にそれを行います
( Steven Suditが述べたように)。
int64 val64 = ...;
int32 val32 = ...;
...
val32 = val64; // get the low 32 bits
// or
val32 = (val64 >> 32); // get the high 32 bits
コンパイラが警告を表示する場合があるため、キャストを指定できます
val32 = (int32)val64;
次のようにします。
long tempLong = ((yourLong >> 32) << 32); //shift it right then left 32 bits, which zeroes the lower half of the long
int yourInt = (int)(yourLong - tempLong);
これは最もコンパクトな方法ではないかもしれませんが、私には最も読みやすいようです。次のコードは、long の上位半分を抽出します。
long tempLong = (int)(yourLong >> 32);
言語を指定しませんでしたが、多くの場合、必要なのはそれを Int32 にキャストすることだけです。上位ビットは破棄されます。
コンパイラにエンディアンを処理させ、すべてのビットシフト、ポインター操作などを非表示にすることができます。
DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
ULARGE_INTEGER uli;
uli.QuadPart = in64;
return uli.LowPart;
}
C/C++ では、(私の意見では) 最善の方法は共用体を使用することです。たとえば、次の関数は無名共用体を使用して、64 ビット整数から下位 32 ビットを抽出します。
uint32_t lower_32_bits(uint64_t value) {
union { uint64_t value; struct { uint32_t high, low; }; } converter;
converter.value = value;
return converter.low;
}
このユニオン トリックは、浮動小数点値のビットを同じビット長の整数に変換するなど、あらゆる種類の操作に使用できます。たとえば、ビット演算やその他のハックを行う場合などです。