UInt64 в 32-битной системе, нужно генерировать из UInt32 или массива байтов, как? - PullRequest
0 голосов
/ 25 сентября 2011

Чтобы сгенерировать 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 предоставляет методы для сравнения экземпляров этого типапреобразовать значение экземпляра в его строковое представление и преобразовать строковое представление числа в экземпляр этого типа.

Довольно бесполезно, не так ли?

1 Ответ

2 голосов
/ 25 сентября 2011

Прежде чем сдвинуть значение, вам нужно static_cast присвоить ему UInt64 В противном случае вы сдвигаете 32-битное значение на 32 позиции, и это неопределенное поведение. Сдвиг 64-битного значения на 32 позиции - это нормально.

...