【发布时间】:2016-10-09 19:34:00
【问题描述】:
我有一个有符号的 8 位值(二进制补码)存储在一个无符号的 uint8_t 变量中。 发生这种情况是因为该值是通过 spi 接口从外部外围设备读取的,例如:
uint8_t return_value = read_spi(uint8_t register_address)
外设的数据表表明该特定地址包含二进制补码值,因此 return_value 内的位模式应该是有符号的 8 位值。
我知道检索有符号值的明显方法:去掉符号位,如果为负翻转位,则加 1,乘以 -1。
我想知道是否有更优雅的方式。
【问题讨论】:
-
如果您在寄存器中的值是有符号值,您只需将其作为有符号值处理,无需进行转换,简单的转换就足够了。用于读取外围寄存器的通用例程以允许读取任何值的方式编写。这类似于缓冲区读取,其中缓冲区被定义为通用字符,然后分配给结构或其他东西。你要做的很简单:
int8_t MyVar = (int8_t)read_spi(RegAddr); -
int8_t MyVar = (int8_t)read_spi(RegAddr);我同意这可能有效,正如 user694733 所说,但从任何角度来看,这不是类型转换吗?
-
为什么不是类型转换?演员表操作员就在那里:
(int8_t)。为什么这很重要?这种转换定义明确、安全且可移植。 -
您不需要算术运算来检索带符号的值 - 它只是对 same 位模式的重新解释 - 将其分配给带符号的类型(带或不带显式转换)并继续。
标签: c integer embedded type-conversion