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 回答