gpt4 book ai didi

c - 使用 uint32_t 存储四个独立的 uint8_t 值

转载 作者:行者123 更新时间:2023-12-01 12:07:29 25 4
gpt4 key购买 nike

我想使用 uint32_t 来存储 4 个独立的 uint8_t 值,并且能够单独读/写它们中的每一个。

执行以下任一操作来设置每个 8 位范围的值是否安全?如果是,哪个更好(更快、更便携)?我不一定要一次设置它们,我只是说明如何在任何时间点设置每个 8 位值。

uint32_t x = ...;

选项 1:

((uint8_t *)(&x))[0] = a;
((uint8_t *)(&x))[1] = b;
((uint8_t *)(&x))[2] = c;
((uint8_t *)(&x))[3] = d;

选项 2:

x = (x & 0xFFFFFF00) | (uint32_t) a;
x = (x & 0xFFFF00FF) | (uint32_t) b << 8;
x = (x & 0xFF00FFFF) | (uint32_t) c << 16;
x = (x & 0x00FFFFFF) | (uint32_t) d << 24;

最佳答案

您的初始修订对选项 2 有一个正确的尽管是迂回方法,这是

// a, b, c, and d are of initialized and of type uint8_t
uint32_t x = ...;
x = (x & 0xFFFFFF00) | (uint32_t) a;
x = (x & 0xFFFF00FF) | (uint32_t) b << 8;
x = (x & 0xFF00FFFF) | (uint32_t) c << 16;
x = (x & 0x00FFFFFF) | (uint32_t) d << 24;

选项 2 的修订是错误的:

uint32_t x = ...;
x |= (uint32_t) a;
x |= (uint32_t) b << 8;
x |= (uint32_t) c << 16;
x |= (uint32_t) d << 24;

即使 x 已初始化,它仍然是错误的,因为您没有设置 8 位范围,而是对它们进行或运算

正确的做法是

// a, b, c, and d are of initialized and of type uint8_t
uint32_t x = (uint32_t) a;
x |= (uint32_t) b << 8;
x |= (uint32_t) c << 16;
x |= (uint32_t) d << 24;

或者更简洁

// a, b, c, and d are of initialized and of type uint8_t
uint32_t x =
(uint32_t) a
| (uint32_t) b << 8
| (uint32_t) c << 16
| (uint32_t) d << 24;

选项 1 的问题是它假定 uint32_t 的字节顺序为 LSB 优先,因此不是可移植的解决方案。


在收到有关您提出的问题的说明后,您的初始修订(此答案中的第一个代码块)是正确的方法。它保留剩余的 24 位不变,同时将特定的 8 位范围设置为 RHS 上的 uint8_t 值。

关于c - 使用 uint32_t 存储四个独立的 uint8_t 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55051882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com