【问题标题】:How to Add signed 8-bit from unsigned 16-bit?如何从无符号 16 位添加有符号 8 位?
【发布时间】:2015-09-06 17:34:27
【问题描述】:

我无法理解如何执行以下操作:

我有一个 uint8_t 元素数组。从这个数组中,我想获取一个元素并将其添加到 uint16_t 项目中。但是,出于此操作的目的,我想将此 uint8_t 值解释为有符号值。

uint16_t A;
uint8_t  B;
uint16_t result;

result = A + (int8_t)B;

但是我了解到这种强制转换可能不起作用。我想不出任何其他方法来让它发挥作用。重要的是我的数组的元素保持为uint8_t,否则。仅对于此操作,我是否希望将 uint8_t 元素解释为有符号值 (int8_t)。

【问题讨论】:

  • 是演员真的失败了,还是你担心你听到了什么?

标签: c casting unsigned signed


【解决方案1】:

您被误导了:您的代码没有任何问题,也没有任何证据支持这种转换可能不起作用的说法。

从技术上讲,int8_t 类型在您的系统上不可用的可能性很小,但在这种极不可能的情况下,uint8_t 也不会被定义。此类系统包括一些 DSP 和一些过时的大型机。如果您正在为更主流的系统编程,请不要担心。

【讨论】:

  • 原来我有一个严重的误解。在 C 中,最终结果将被提升为混合类型操作的无符号值。我误解了这意味着强制转换不会对此类操作产生影响。
  • @thejonny:这并不完全正确:这取决于您系统上int 的大小。 int是16位,和int16_t一样,然后(int8_t)B转换成unsigned int,这涉及到一个初始的符号扩展,对unsigned int进行操作A + (int8_t)B。如果int 大于16 位,则两个操作数都提升为int,并且当存储到result 时,运算结果将向下转换为uint16_t。这两种方法在 2s 补码架构上给出了相同的结果。
  • @chqrlie 我错误地看到了潜在的不同有符号整数溢出,并删除了我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多