从 uint16 到 uint8 的转换

San*_*ius 2 c compression type-conversion stm32

有人知道如何在我的 STM32F091 的 C 程序中正确地将 uint16 转换为 uint8 吗?

我以为是这样的:

uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test;
Run Code Online (Sandbox Code Playgroud)

但这效果不佳,所以有人有建议吗?


[来自评论的更新:]

我使用的电位器的最小值为 0x0,最大值为 0xFFF。测试必须有ADC1->DR的值(这是来自STM32F0中ADC的值)

Ian*_*Ian 5

编辑:

在这种情况下,您无法在不丢失信息的情况下压缩数据。由于您从 ADC 的数据范围是 0x000 到 0xFFF - 您无法完美地表示数据而不会在 uint8 字节中丢失信息/精度,其范围仅为 0x00 到 0xFF

但你仍然可以映射数据精度丢失。例如:

uint8_t Test2 = (unsigned)(Test >> 4);
Run Code Online (Sandbox Code Playgroud)

将导致您将每 16 个范围映射到一个值:

0-15 -> 0
16-31 -> 1
32-47 -> 2
//and so on
Run Code Online (Sandbox Code Playgroud)

由于无论如何你只有 8 个 LED,你可以使用 uint8 字节来控制 LED - 虽然你会失去实际值的精度,但你仍然可以用你的 8正确表示值的范围(每单位 16)LED(因为无论如何你只有8 个 LED)

原来的:

当您将较大的 uint16 数据类型转换为较小的 uint8 时,这种情况很可能是由溢出引起的:

uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test; //Test2 value is only 0x65, 0x500 is missing
Run Code Online (Sandbox Code Playgroud)

强制转换会导致截断最高有效字节值 (0x500)。

  • 唉,今天的 SO 怎么了。没有明确原因就投反对票。虽然我们可以帮助新用户“教鱼”,但选择对答案投反对票。 (2认同)