Мне просто интересно, как это работает, и понять, действительно ли это работает.
Если у вас 32-битный массив типа int и 8-битный массив типа int размером 4. Можно ли назначить 32-битный тип int 0-му индексу в массиве 8-битного типа int и эффективно иметь одно и то же значение в битовом выражении.
Также, если вы захотите затем преобразовать его обратно, я полагаю, что вы могли бы заполнить 32-битное int массивом и соответствующими битовыми сдвигами.
int32 bigVbl = 20;
int8 smallVbl[4];
smallVbl[0] = bigVbl;
Я ожидаю, что массив smallVbl будет содержать весь bigVbl.
Назначения всегда усекают наиболее значимые биты и сохраняют младшие биты. Другие арифметические операции также обрезают результат, если он переполняется. Таким образом, вы можете легко расширить математические операции (и многие другие операции) для работы с большими целыми числами. Без усечения, как вы можете собрать 32 бита в 8 бит?
Чтобы скопировать 32-битный тип int в массив из 4 8-битных символов, проще всего скопировать целое число в массив. Другой способ — назначить элемент за элементом
smallVbl[0] = bigVbl & 0xff; // the & 0xff is not really needed
smallVbl[1] = (bigVbl >> 8) & 0xff;
smallVbl[2] = (bigVbl >> 16) & 0xff;
smallVbl[3] = (bigVbl >> 24) & 0xff;
Есть несколько способов сделать это, самый простой из них std::copy_n
скопировать целое число в массив:
std::copy_n(reinterpret_cast<int8*>(&bigVbl), // Source to copy from
std::min(sizeof(smallVbl), sizeof(bigVbl)), // Number of bytes to copy
smallVbl); // Destination to copy to
Чтобы скопировать противоположное направление, просто поменяйте местами источник и пункт назначения в вышеуказанном вызове.