我试图以一种可移植的方式将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)来做到这一点?