当前位置: 首页 > ds >正文

float负数浮点值强转uint16_t

在C++中,uint16_t 是无符号类型(范围 0~65535),无法直接存储负数。若需保留负号和整数部分,可通过以下两种方案实现:


方案一:使用有符号类型 int16_t(推荐)

 

cpp

float abc = -123.0;
int16_t d = static_cast<int16_t>(abc); // 直接转换
qDebug() << "d:" << d; // 输出: d: -123

方案二:用 uint16_t 模拟负数(编码/解码)

若必须使用 uint16_t,可通过补码形式存储负数:

1. 编码(浮点转 uint16_t

cpp

float abc = -123.0;
int16_t temp = static_cast<int16_t>(abc); // 转为有符号整数
uint16_t d = static_cast<uint16_t>(temp); // 存储为无符号类型
qDebug() << "d:" << d; // 输出: d: 65413 (即 0xFF85)
2. 解码(uint16_t 还原为整数)

cpp

int16_t original = static_cast<int16_t>(d); // 还原为有符号整数
qDebug() << "Original:" << original; // 输出: Original: -123

关键原理

  • uint16_t 无法直接存负数,但可通过 补码二进制格式 间接表示。
  • 例如,-123 的16位补码为 0xFF85,存入 uint16_t 后,再转回 int16_t 即可还原。

注意事项

  • 确保数值范围在 -32768 到 32767 之间(int16_t 的范围),否则会溢出。
  • 若需直接操作 uint16_t 的二进制位,可用位掩码提取符号和数值部分(需自定义编码逻辑)。

在C语言中,由于uint16_t是无符号类型,无法直接存储负数。但你可以通过类型转换,将负的浮点数的整数部分以补码形式存储在uint16_t中。以下是实现方法:

 

c

#include <stdio.h>
#include <stdint.h>
int main() {
float abc = -123.0;
int16_t temp = (int16_t)abc; // 强制转换为有符号16位整数,保留负号和整数部分
uint16_t d = (uint16_t)temp; // 再转换为无符号16位整数(存储补码)
// 打印结果(以十六进制和十进制显示)
printf("d (hex): 0x%04X\n", d); // 输出补码形式
printf("d (decimal): %u\n", d); // 以无符号数输出
// 若需还原为有符号整数
int16_t original = (int16_t)d;
printf("Original value: %d\n", original);
return 0;
}

关键点解释:

  1. 强制类型转换
    • int16_t temp = (int16_t)abc;:将浮点数-123.0强制转换为有符号16位整数,直接截断小数部分并保留负号。
    • uint16_t d = (uint16_t)temp;:将有符号整数转换为无符号整数,此时负数会以其补码形式存储。
  2. 补码表示
    • -123的16位补码表示为0xFF85(十六进制),对应十进制无符号值为65413
  3. 还原值
    • 通过int16_t original = (int16_t)d;可将uint16_t的补码还原为有符号整数。

输出结果:

 

d (hex): 0xFF85
d (decimal): 65413
Original value: -123

注意事项:

  • 范围限制:确保浮点数的整数部分在int16_t范围内(-32768 ~ 32767),否则会溢出。
  • 精度丢失:直接强制转换会丢弃小数部分(如-123.9也会转换为-123)。
http://www.xdnf.cn/news/13523.html

相关文章:

  • NIFI的处理器:ConsumeMQTT 2.4.0
  • 【Zephyr 系列 17】多协议网关实战:BLE + LoRa + UART + MQTT 综合调度系统设计与实现
  • CoW模式、线程的本地存储和生产者-消费者模式
  • 线程分离属性
  • 【Python】 -- 趣味代码 - 扫雷游戏
  • 使用obsutil工具在OBS上完成基本的数据存取【玩转华为云】
  • LLM 推理:LLM 路由和分层技术的表征和分析
  • 进行性核上性麻痹护理指南:全维度守护健康
  • LIGHT (数据库操作)
  • 【Css】css修改滚动条的样式
  • MySQL InnoDB更新流程
  • Python格式化:让数据输出更优雅
  • 场景题目记录
  • Java - Mysql数据类型对应
  • JxBrowser 8.8.0 版本发布啦!
  • 小天互连IM系统:即时通讯在远程工作中的应用
  • 系统思考:恶性循环
  • 走线太长导致的下冲(Undershoot)现象及解决
  • matplotlib画图报错
  • 使用 pytdx,`TdxHq_API` 接口下载数据的 AI 编程指引提示词
  • 微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
  • 第二十章 BKP
  • 华为认证入门怎么选?
  • Java-面向对象-类与对象(基础)
  • leetcode题解450:删除BST中的结点!调整二叉树的结构最难!
  • ​​绿色PCB通关密码:猎板无铅焊料+水性油墨的RoHS合规实践​​
  • SpringBoot基于RabbitMQ实现异步请求处理
  • CentOS7下的Flink 集群部署
  • 【LLM】深入解析MCP的三种传输方式实现
  • 《C++ 继承》