如何将无符号整数转换为无符号字符

3

我正在尝试将数字传感器模块与Arm Cortex M4F芯片接口。

从模块接收到的数据是3字节。然而,在我的MCU中,我唯一可用的函数是uint32_t读取函数。我不知道为什么没有uint8_t函数,但也许只是位移的问题?我在学习c++的过程中。

所以我读取的值为:

uint32_t value = mcu_read(pin);

value 现在包含一个 uint32_t,即4个字节。我需要其中的前三个字节。有没有任何方法可以将其移位以“提取”它们? 这有意义吗?关键问题是 mcu_read 函数要求至少读取4个字节。如果有一个读取 uint8_t 的函数,我就可以调用它三次以获取所需数据。


1
将不感兴趣的字节掩盖为 0 并将值保留在 uint32_t 中可能会更容易,而不是处理 3 个单独的值。 - Voo
3个回答

8
你可以使用 位移逻辑与 提取字节:
uint32_t value = mcu_read(pin);
uint8_t byte_0 = (value >> 24) & 0xFF;
uint8_t byte_1 = (value >> 16) & 0xFF;
uint8_t byte_2 = (value >> 8) & 0xFF;
uint8_t byte_3 = (value) & 0xFF;

比C风格的转换更好。只需在前面添加“const auto”。 - Vorac
@Vorac,您对auto的建议是什么? - M.M
我的错误,不用在意。 - Vorac

3

像这样的内容?

uint32_t value = mcu_read(pin);
uint8_t* bytes = (uint8_t*)(&value);
uint8_t byte_0 = bytes[0];
uint8_t byte_1 = bytes[1];
uint8_t byte_2 = bytes[2];
uint8_t byte_3 = bytes[3];

注意字节序


我没有像那样考虑过它! - fUrious
1
计算机中有两个关于字节序的“有趣”部分 - 一个是字中字节的顺序,另一个是字节中位的顺序。 - Vorac
@Voo uint8_t 应该是一个字符类型(虽然标准并没有保证,但所有现有的实现都是这样,并且在实践中这是一个安全的假设)。 - M.M
@M.M 对于严格别名规则来说,这并不重要。即使 uint8_tchar 相同,它也不会被排除在严格别名之外,因为 char 也不是。至少这是我记得标准的最后状态。 - Voo
@Voo 字符类型被豁免严格别名规则,其中包括针对字符类型的typedef。 - M.M
显示剩余3条评论

1
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint32_t value = 0xAABBCCDD;
    //-------------------------------
    //byte3 | byte2 | byte1 | byte0 | 
    //-------------------------------
    uint8_t byte_0 = (uint8_t)value; //truncation according to casting rules
    printf("first byte: %x\n",byte_0);
    value>>=8; //right shift will result in the following bytes:
    //-------------------------------
    // garbage | byte3 | byte2 | byte1 | 
    //-------------------------------
    uint8_t byte_1 = (uint8_t)value;
    printf("second byte: %x\n ",byte_1);
    value>>=8;
    //etc...
}

输出:

first byte: dd
second byte: cc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接