小编Chr*_*ris的帖子

将uint8_t作为int8_t进行便携式重新解释并强制对其进行恭维

我试图以一种可移植的方式将uint8_t重新解释为int8_t(并再次返回).我正在通过一个存储在uint8_t缓冲区中的串行通道接收,但是一旦我知道它是什么类型的数据包,我需要将一些字节解释为两个恭维,其他字节解释为无符号.

我知道这将适用于许多编译器:

int8_t i8;
uint8_t u8 = 0x94;

i8 = (int8_t)u8;
Run Code Online (Sandbox Code Playgroud)

但是当u8> 127时无法保证工作,因为将一个大于INT8_MAX的值转换为int8_t是未定义的(我认为).

我能想出的最好的就是这个

int8_t i8;
uint8_t u8;

i8 = (u8 > INT8_MAX) ? (int8_t)(-(256-u8)):(int8_t)u8;
Run Code Online (Sandbox Code Playgroud)

这应该始终有效,因为减法总是会导致自动升级到int,并且绝不依赖于底层表示.它隐含地强制对两个大于INT8_MAX的值进行恭维解释.

有没有更好的方法(或标准的MACRO)来做到这一点?

c casting stdint

5
推荐指数
1
解决办法
91
查看次数

标签 统计

c ×1

casting ×1

stdint ×1