Чтобы сгенерировать UInt64, в «предупреждение C4293:« <<: отрицательное или слишком большое неопределенное поведение смещения »приводят следующие результаты </p>
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 предоставляет методы для сравнения экземпляров этого типапреобразовать значение экземпляра в его строковое представление и преобразовать строковое представление числа в экземпляр этого типа.
Довольно бесполезно, не так ли?