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

C++符号拓展带来的问题

符号扩展是指在将较小位宽的有符号整数转换为较大位宽的有符号整数时,保持数值符号不变的过程。符号扩展通常通过在高位填充符号位的值来实现。

符号扩展的规则如下:

  1. 如果最高位(符号位)是 0(表示正数),则在高位填充 0。
  2. 如果最高位是 1(表示负数),则在高位填充 1。

例如,假设一个 8 位的 char 类型val值为 0xFF,它在内存中的二进制表示是 11111111。这个值在 char 中表示 -1。如果我们将其转换为 32 位整数,符号扩展会将其转换为 11111111111111111111111111111111,这仍然是 -1 的二进制表示。

那么这就会导致一个问题,就是当发生unsigned和signed不同大小的整型类型之间的转换时,可能会出现结果不一致的问题,例如:

如下是一个一次性读取24位数值的函数:

uint32_t readU24(const char* p) 
{
    uint32_t value = 0;
    value |= (p[0] << 16);
    value |= (p[1] << 8);
    value |= p[2];
    return value;
}

当传入数据为char data[] = {0xFF, 0x01, 0x02};时,最终输出的结果为 0xFFFF0102,而不是预期的0xFF0102,这是因为在执行value |= (p[0] << 16);语句时,p[0]为0xFF,左移16位之后是0xFF0000,在value对其进行或运算时,会由于char和uint32_t之间的类型发送符号拓展,填充高位的值’1’,那么执行完这条语句之后的value值则为:0xFFFF0000。所以,value的值已经与预期结果不符了。

对应的解决方案有多种,这里就不写了,简单叙述:可以新建一个unsigned char的指针指向p,避免符号拓展,或者将参数p改为unsigned char*等。

所以,最好就是不要让不同整型(有无符号)之间的指针进行操作,保持统一,避免出现bug。

http://www.dtcms.com/a/16967.html

相关文章:

  • 反向代理ml
  • 使用Python爬虫获取淘宝Custom API接口数据
  • Linux TCP 编程详解与实例
  • 深度探索未来的搜索引擎 —— DeepSeek
  • 美术教程2025
  • 数据挖掘智能Agent
  • Apache Iceberg 与 Apache Hudi:数据湖领域的双雄对决
  • 【网络安全 | 漏洞挖掘】后端接受非预期参数的故事
  • 【读点论文】Rewrite the Stars将svm的核技巧映射到高维空间,从数理逻辑中丰富特征维度维度
  • 详解C++的存储区
  • 在AMLOGIC android14 平台上使用adb
  • 如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍
  • QT c++ QMetaObject::invokeMethod函数 线程给界面发送数据
  • UE5中的快捷键汇总
  • 电源测试和测量系统的创新遥感方法可以消除哪些潜在问题
  • 土建施工员考试题库及答案
  • 在 CentOS 上更改 SSH 默认端口以提升服务器安全性
  • Django 初学小案例:用户登录
  • Windows搭建SVN本地服务器 + TortoiseSVN客户端
  • SQL Query美化
  • 单细胞学习(13)—— Seurat → Scanpy 分析流程
  • UnrealEngine开发无人机飞行模拟软件的手柄如何选择
  • JAVA生产环境(IDEA)排查死锁
  • Grafana Windows在 Windows 上轻松实现数据监控与可视化
  • VSCODE - 连接远程linux服务器,报错XHR failed 解决方法
  • C语言-------结构体(1)
  • 华宇TAS应用中间件与因朵科技多款产品完成兼容互认证
  • 内容中台驱动企业数字化内容管理高效协同架构
  • Spring框架中都用到了哪些设计模式?
  • 电商小程序(源码+文档+部署+讲解)