从 uint16 到 uint8 的转换
Convertion from a uint16 to uint8
有人知道如何在 C 程序中为我的 STM32F091 正确转换 uint16 到 uint8 吗?
我以为是这样的:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test;
但这不是很好,所以有人有建议吗?
[更新自 :]
我使用的电位器最小值为0x0,最大值为0xFFF。测试必须有ADC1->DR的值(这是来自STM32F0中ADC的值)
编辑:
在这种情况下,您无法在不丢失信息的情况下压缩数据。由于您的 ADC 数据范围是 0x000 到 0xFFF - 如果不丢失 information/precision 范围仅从 0x00 到 0xFF
的 uint8 字节,您就无法完美地表示数据
但您仍然可以映射数据 ,但精度会丢失 。例如:
uint8_t Test2 = (unsigned)(Test >> 4);
将使您将每 16 个范围映射到一个值:
0-15 -> 0
16-31 -> 1
32-47 -> 2
//and so on
因为你只有 8 个 LED,你可以使用 uint8 字节来控制 LED - 虽然你会失去真实值的精度,但你仍然能够表示值的范围(每单位 16 ) 正确 与你的 8 个 LED(因为你 只有 有 8 个 LED)
原文:
当您将较大的 uint16 数据类型转换为较小的 uint8 数据类型时,这种情况很可能是溢出引起的:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test; //Test2 value is only 0x65, 0x500 is missing
转换导致最高有效字节值 (0x500) 被截断。
有人知道如何在 C 程序中为我的 STM32F091 正确转换 uint16 到 uint8 吗?
我以为是这样的:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test;
但这不是很好,所以有人有建议吗?
[更新自
我使用的电位器最小值为0x0,最大值为0xFFF。测试必须有ADC1->DR的值(这是来自STM32F0中ADC的值)
编辑:
在这种情况下,您无法在不丢失信息的情况下压缩数据。由于您的 ADC 数据范围是 0x000 到 0xFFF - 如果不丢失 information/precision 范围仅从 0x00 到 0xFF
的 uint8 字节,您就无法完美地表示数据但您仍然可以映射数据 ,但精度会丢失 。例如:
uint8_t Test2 = (unsigned)(Test >> 4);
将使您将每 16 个范围映射到一个值:
0-15 -> 0
16-31 -> 1
32-47 -> 2
//and so on
因为你只有 8 个 LED,你可以使用 uint8 字节来控制 LED - 虽然你会失去真实值的精度,但你仍然能够表示值的范围(每单位 16 ) 正确 与你的 8 个 LED(因为你 只有 有 8 个 LED)
原文:
当您将较大的 uint16 数据类型转换为较小的 uint8 数据类型时,这种情况很可能是溢出引起的:
uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test; //Test2 value is only 0x65, 0x500 is missing
转换导致最高有效字节值 (0x500) 被截断。