#c #virtual-machine #byte #endianness
#c #виртуальная машина #байт #порядковый номер
Вопрос:
В настоящее время я пишу виртуальную машину. Давайте предположим, что существует инструкция, которая хранит 64-разрядное целое число в регистре, и предположим, что оно выглядит следующим образом: 0x00, [0xAB, 0xCD, 0xEF, 0xFF, 0xAB, 0xCD, 0xEF, 0xFF], где часть внутри квадратных скобок является фактическим 64-разрядным целым числомв формате big-endian, который будет помещен в регистр, и эти байты будут сохранены в массиве uint8_t.
Есть ли какой-либо способ преобразовать этот массив в a uint64_t
без проверки порядкового номера хост-платформы? Я знаю, что в C есть std::endian::native
; однако я не знаю ни о чем подобном в C.
Комментарии:
1.
x=((uint64_t)arr[0] << 56) ((uint64_t)arr[1] << 48) ... arr[7];
2. @EugeneSh. Это преобразует большой порядковый номер в порядок байтов хоста (который также может быть большим порядковым номером) или просто преобразует большой порядковый номер в маленький порядковый номер
3. Он преобразуется в любые
uint64_t
средства. Арифметика не зависит от порядкового номера.4. @0___________ Нет, это код виртуальной машины, скомпилированный для хоста. Массив представляет память виртуальной машины. Теперь рассмотрим, что op хочет, скажем, эмулировать добавление двух ячеек памяти виртуальной машины с использованием собственного
оператора. Поэтому им необходимо преобразовать ячейку памяти в собственный целочисленный тип.
5. @0___________ Юджин совершенно верно подметил это. Порядковый номер имеет значение только тогда, когда вы смотрите на данные извне, как на поток байтов. Но «внутри» число — это просто число. Если я скажу
int i
илиuint64_t u64
, так же мало смысла спрашивать, являются ли эти числа большими или маленькими, как и спрашивать, в какой базе они находятся. Код Юджина принимает внешнее представление в формате big-endian и переносимо преобразует его во внутреннюю реализацию машины, какой бы она ни была.