Вот конкретный пример, который должен избегать любого неопределенного поведения из-за строгого наложения псевдонимов / «незаконных» приведений / и т. Д., Так как это, по-видимому, то, что вас действительно интересует.
Этот код принимает std::uint64_t
, копирует его в массив из четырех std::uint16_t
с, изменяет значения в массиве, а затем копирует их обратно в исходный std::uint64_t
.
#include <cstdint>
#include <cstring>
#include <iostream>
int main() {
std::uint64_t data = 0xffeeddccbbaa5577;
std::uint16_t data_spliced[4];
std::memcpy(&data_spliced, &data, sizeof(data));
std::cout << "Original data:\n" << data << "\nOriginal, spliced data:\n";
for (const auto spliced_value : data_spliced) {
std::cout << spliced_value << " ";
}
std::cout << "\n\n";
data_spliced[2] = 0xd00d;
memcpy(&data, &data_spliced, sizeof(data));
std::cout << "Modified data:\n" << data << "\nModified, spliced data:\n";
for (const auto spliced_value : data_spliced) {
std::cout << spliced_value << " ";
}
std::cout << '\n';
}
с выводом (на моей машине):
Original data:
18441921395520329079
Original, spliced data:
21879 48042 56780 65518
Modified data:
18441906281530414455
Modified, spliced data:
21879 48042 53261 65518