【问题标题】:Convertion from a uint16 to uint8 [closed]从 uint16 到 uint8 的转换 [关闭]
【发布时间】:2016-08-12 01:12:05
【问题描述】:

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

我以为是这样的:

uint16_t Test = 0x565;
uint8_t Test2 = (uint8_t)Test;

但是效果不是很好,有没有人给点建议?


[更新自comment:]

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

【问题讨论】:

  • “16uint”和“8uint”是什么类型?您的文本使用不同的类型。 “效果不好”是什么意思?为什么?在什么意义上?
  • 你不能将一夸脱放入品脱罐中。
  • 对不起 - 谚语没有公制版本
  • 您知道转换为更小的整数可能会导致数据丢失吗?
  • 神奇的词是“缩放”。只需应用“三规则”/“比例规则”。

标签: c compression type-conversion stm32


【解决方案1】:

编辑:

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

但您仍然可以在精度丢失的情况下映射数据。例如:

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) 被截断。

【讨论】:

  • 但是 OP 不是已经意识到数据丢失了吗?
  • @HappyCoder 可能会也可能不会。但单从代码来看,他不知道的可能性更大。
  • 唉,今天的 SO 怎么了。没有明确的理由投反对票。虽然我们可以帮助新用户“教鱼”,但我们会选择对答案投反对票。
  • 给了你一个赞成票,但我可以建议删除答案的第一个版本。它没有增加任何价值。缩放值以提供完整范围是正确答案,并且应该在顶部。
  • @user3386109 建议已接受。谢谢。
猜你喜欢
  • 2021-01-22
  • 2022-07-21
  • 2017-11-05
  • 2013-02-10
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多