Порядковый номер C и массив байтов

#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 и переносимо преобразует его во внутреннюю реализацию машины, какой бы она ни была.