加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 04:26:34 所属栏目:Windows 来源:网络整理
导读:我试图以一种可移植的方式将uint8_t重新解释为int8_t(并再次返回).我正在通过一个存储在uint8_t缓冲区中的串行通道接收,但是一旦我知道它是什么类型的数据包,我需要将一些字节解释为两个恭维,其他字节解释为无符号. 我知道这将适用于许多编译器: int8_t i8;
我试图以一种可移植的方式将uint8_t重新解释为int8_t(并再次返回).我正在通过一个存储在uint8_t缓冲区中的串行通道接收,但是一旦我知道它是什么类型的数据包,我需要将一些字节解释为两个恭维,其他字节解释为无符号.

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

int8_t i8;
uint8_t u8 = 0x94;

i8 = (int8_t)u8;

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

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

int8_t i8;
uint8_t u8;

i8 = (u8 > INT8_MAX) ? (int8_t)(-(256-u8)):(int8_t)u8;

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

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

解决方法

如果int8_t被定义(由< stdint.h>),则保证是2的补码(由C 2018 7.20.1.1).

通过使用memcpy(& i8,& u8,sizeof i8);将uint8_t u8中的值重新解释为int8_t i8,可以将其重新解释为2的补码值. (优秀的编译器会优化它,只需使用u8作为二进制补码值,不需要调用memcpy.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读