0

UInt64を生成するには、次の結果が「警告C4293:'<<':シフトカウントが負または大きすぎる、未定義の動作」になります。

UInt64 byteArrayToUInt64(int %stI, array<Byte>^ byteArray) {
    UInt64 retV = byteArrayToUInt32(stI, byteArray);
    retV |= byteArrayToUInt32(stI, byteArray) << 32;
    return retV;
}

また

UInt64 byteArrayToUInt64(int %stI, array<Byte>^ byteArray) {
    stI += 8;
    return byteArray[stI - 8] | byteArray[stI - 7]  << 0x08 |  byteArray[stI - 6]
     << 0x10 |  byteArray[stI - 5]  << 0x18 |  byteArray[stI - 4] << 0x20 |  byteArray[stI - 3]
     << 0x28 |  byteArray[stI - 2]  << 0x30 |  byteArray[stI - 1] << 0x38;
}

残念ながら、すべてのMSはUInt64構造について次のように言う必要があります。

UInt64値型は、0から18,446,744,073,709,551,615の範囲の値を持つ符号なし整数を表します。

UInt64は、このタイプのインスタンスを比較し、インスタンスの値をその文字列表現に変換し、数値の文字列表現をこのタイプのインスタンスに変換するメソッドを提供します。

かなり役に立たないですね。

4

1 に答える 1

2

値をシフトする前に、値をにシフトする必要がありstatic_castますUInt64。それ以外の場合は、32ビット値を32位置シフトしますが、これは未定義の動作です。64ビット値を32桁シフトしても問題ありません。

于 2011-09-24T23:18:56.040 に答える