将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.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows-phone-7 – 如何从Windows 7手机上的列表框中删除项
- 【ZT】iSpring Free Cam – 免费易用的「录制屏幕」工具 [W
- windows-phone-7 – 记住LongListSelector的位置
- 脚本 – 以一个步骤(在windows上使用7zip)以编程方式提取ta
- 让CMake在Windows上找到flex
- 使用JFlex生成词法分析器 1:安装配置
- 在Windows上可靠地复制文件,无论ACL
- Windows – SVN校验和不匹配的根本原因是什么?
- windows – 如何将巨大的文件复制到远程共享文件夹?
- 部署 – 在GPO部署的软件包中管理自我更新的Windows软件