首页 > 其他分享 >整数提升规则

整数提升规则

时间:2024-12-28 10:30:32浏览次数:4  
标签:11111111 ch int uint8 整数 提升 规则 类型 0xfd

今天写代码遇到一个类似这样的问题,0xfd!=0xfd 我脑袋懵了,这两个值不是相等的吗?
让我们来看看怎么个事

uint8_t binHeader[10] = { 0x01,0xfd };
uint8_t ch = 0x02;

if (binHeader[1] ==(~ch))
{
        printf("相等");
}
else
{
        printf("不相等");
}

看似很正常的判断,对于0x02进行取反操作得到的值为0xfd,但是输出的结果为不相等!!!

因为~ch 取反操作的这个运算,由于ch是uint8_t类型,也就是unsigned char类型,运算结果后的类型会受到 C 语言的 整数提升规则(integer promotion)的影响。

什么是整数提升规则呢?

  • 整数提升规则:在 C 语言中,uint8_t 是一个小于 int 的类型,当对它进行运算时,首先会将其提升为 int 类型。这个提升是因为 C 语言的标准要求,算术运算总是以 int 或更大类型来执行,即使操作数是较小的类型(如 uint8_t)。

也就是

  • m_version 是 uint8_t 类型,它会首先被提升为 int 类型(通常是 32 位),然后 ~ 运算符会在这个提升后的 int 类型上执行。
  • 结果是一个 int 类型的值,而不是 uint8_t 类型。
    0x02 在8位二进制中为 00000010
    取反之后为0x11111101,由于整数提升规则,实际为
    11111111 11111111 11111111 11111101 这个值为-3;
    所以判断0xfd != - 3 结果为不相等

为什么是-3呢?
这实际上是 -3 的二进制补码表示。我们来验证一下:
在计算机中,负数是以 补码 的形式表示的。为了表示 -3,我们先从 3 的二进制开始,然后取反并加 1:

  • 6 的二进制表示是:00000000 00000000 00000000 00000011
  • 取反:11111111 11111111 11111111 11111100
  • 加 1:11111111 11111111 11111111 11111101
    这就是 -3 的补码表示。

所以我们要加个强转类型,防止他变为int类型,让他运算之后还是uint8_t类型 这么写,输出的值为相等

uint8_t binHeader[10] = { 0x01,0xfd };
uint8_t ch = 0x02;

if (binHeader[1] ==(uint8_t)(~ch))
{
        printf("相等");
}
else
{
        printf("不相等");
}

标签:11111111,ch,int,uint8,整数,提升,规则,类型,0xfd
From: https://blog.csdn.net/qq_49420679/article/details/144783337

相关文章

  • 你是如何有效提升自己的js水平的?有哪些方法?
    提升JavaScript(JS)水平是一个持续不断的过程,涉及多个方面的学习和实践。以下是一些建议,帮助你有效地提升JS水平:系统学习基础知识:掌握变量、数据类型、运算符、控制流(如if语句、for循环)、函数等基本概念。理解JS的作用域、闭包、this关键字、原型链和继承等进阶知识。学习ES6......
  • 探讨篇(三):代码复用的智慧 - 提升架构的效率与可维护性
    作者:京东物流冯志文前两篇从服务粒度和服务内的分层架构角度探讨,本文继续从服务间代码复用角度探讨。背景在分布式架构中,代码复用是个难题。那么如何处理代码功能共享的问题呢?本文结合日常实践中的案例,介绍几种分布式架构中管理代码复用性的技术。包括代码复制、共享代码库(j......
  • 通过在 组策略管理控制台 中配置 AppLocker,可以非常有效地限制 PowerShell 脚本的执行
    在组策略管理控制台(GroupPolicyManagementConsole,GPMC)中配置AppLocker,可以有效地限制和控制哪些应用程序(包括PowerShell脚本)可以在计算机上执行。这是一种通过白名单策略确保只有已批准的应用程序能够运行的强大安全措施。配置AppLocker的步骤:1. 打开组策略管理控制......
  • 私有化部署视频平台EasyCVR小知识:5G技术对安防监控系统的性能提升有哪些具体表现?
    随着5G技术的快速发展和广泛应用,安防监控系统正经历着一场革命性的变化。5G技术以其高速率、低延迟、大连接和大带宽的特性,为安防监控领域带来了前所未有的性能提升。以下是5G技术对安防监控系统性能提升的具体表现。1、强大的性能提升5G技术提供了更快的下载速度和更低的网络......
  • Java性能提升的其他技巧
    Java性能提升的其他技巧虚拟线程Java19引入的一种轻量级线程,即虚拟线程(VirtualThread),并在Java21中正式GA。虚拟线程是Java21引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势:轻量级:虚拟线程由JVM管理,而非操作系统,因此它们的内存占......
  • 网站外链优化:构建权威链接网络,提升SEO效能
    在搜索引擎优化(SEO)的广阔领域中,外部链接(简称外链)扮演着举足轻重的角色。外链,即指向你网站的链接,被视为搜索引擎评估网站权威性和信任度的重要指标之一。优质的外链不仅能够提升网站在搜索引擎结果页面(SERP)的排名,还能增加网站的曝光度和流量。本文将深入探讨网站外链优化的策略......
  • 问答论坛SEO优化:提升排名与用户互动的策略
    在数字化时代,问答论坛不仅是用户获取信息和解决问题的平台,也是企业提升品牌知名度、增加网站流量和建立用户信任的重要渠道。通过搜索引擎优化(SEO)策略,问答论坛可以在搜索结果中获得更高的排名,从而吸引更多潜在用户,增强用户互动和参与度。本文将深入探讨问答论坛的SEO优化策略,......
  • GaussDB基于智能化(AI)技术,打造AI4DB和DB4AI两大技术高地,重构数据库内核核心组件,提升数
    云原生为迎接智能化提供了基础条件,智能化是GaussDB的新的牵引方向,两者相辅相成,互相促进。在智能化出现之前,数据库的运维管理主要依赖分层解耦、化繁为简方式来治理,通过人工服务对单点的业务进行管理。但在云化环境中,一个Region纳管上万实例,仅靠人工很难满足业务诉求,这就促成智能与......
  • 旅行团转型的关键一步:利用管理软件提升客户体验与运营效率
    一、旅行团行业的现状与挑战1.1行业现状传统旅行团通常由旅行社组织,服务内容包括交通、住宿、餐饮、景点门票等一站式服务。随着旅游市场需求的多样化和个性化,传统的“大而全”的旅行团形式已经不能完全满足消费者的需求。消费者越来越注重旅行体验的个性化,尤其是年轻一代游客,......
  • 提升跨文化旅游效率:管理软件在多元文化背景下的应用
    一、跨文化旅游的兴起与发展1.1全球化与文化交流全球化带来了跨文化交流的机遇,推动了不同文化之间的互相理解与融合。旅游作为全球化的一部分,成为人们了解和体验不同文化的重要途径。跨文化旅游不仅帮助游客更好地理解和接触异国文化,同时也为旅游目的地的本土文化带来了更广泛......