首页 > 其他分享 >bool布尔变量取反的一个陷阱

bool布尔变量取反的一个陷阱

时间:2023-09-24 21:56:38浏览次数:31  
标签:res1 32 res0 s0 取反 bool bits uint32 布尔

最近工作上被一个小问题耽误了一些时间,在此记录一下。

问题出在对一个布尔变量的取反上。

我的本意是想检查一个结构体中某 1 bit 是0还是1,我直接进行取反“~”操作,运行是结果跟预想的不一致。才发现这个取反操作是一个坑。

且看下面测试程序:

#define uint32_t unsigned int   

typedef union 
{
    struct {
        uint32_t name       : 8;
        uint32_t age        : 8;
        uint32_t b0         : 1;
        uint32_t b1         : 1;
        uint32_t reserved   : 14;
    } bits;

    uint32_t all;
}ST0;


int main()
{
    printf("=====Test Start.=====\n\n");
    
    bool res0 = 0;
    bool res1 = 0;
    bool res2 = 0;
    uint32_t res0_32 = 0;
    uint32_t res1_32 = 0;

    
    ST0 s0;
    s0.all = 0;
    s0.bits.name = 0xff;

    s0.bits.b0 = 1;
    s0.bits.b1 = 0;

    res0 = ~s0.bits.b0;
    res0_32 = ~s0.bits.b0;
    res1 = ~s0.bits.b1;
    res1_32 = ~s0.bits.b1;

    res2 = !s0.bits.b0;

    printf("The result of bit inverse: res0 =  %d, res1 = %d \n\n", res0, res1);
    printf("The result of bit inverse: res0_32 =  0x%08x, res1_32 = 0x%08x \n\n", res0_32, res1_32);
    printf("The result of bit inverse: res2 =  %d\n\n", res2);

    printf("=====Test End.=====\n\n\n");

    return 0;
}

运行结果如下:

=====Test Start.=====

The result of bit inverse: res0 =  1, res1 = 1 

The result of bit inverse: res0_32 =  0xfffffffe, res1_32 = 0xffffffff 

The result of bit inverse: res2 =  0

=====Test End.=====

最明显的意外之处是,开始s0.bits.b0和s0.bits.b1这两个bit一个是1,一个是0;对它们取反“~”之后赋给一个bool变量,发现结果都是1.

然后我把bool变量的类型改成了32位的无符号数,观察结果发现,实际上程序是s0.bits.b0当作一个32bit的数进行处理的,而不是单纯1bit。

所以前面的结果也就合理了,两个都不是0(res0_32 = 0xfffffffe, res1_32 = 0xffffffff)的数赋值给bool变量,当然结果都是1.

结论是,这种情况下要用“!”而不是“~”。

标签:res1,32,res0,s0,取反,bool,bits,uint32,布尔
From: https://www.cnblogs.com/bailiji/p/17726765.html

相关文章

  • 布尔数据 BOPDS_DS
    布尔数据[email protected]在OpenCASCADE中,布尔相关的算子Operator有GeneralFuseOperator(GFA),BooleanOperator(BOA),SectionOperator(SA),SplitterOperator(SPA),这些布尔算子都共用一套数据结构BOPDS_DS,其中存储了输入数据及中间结果数据。布尔算子包含......
  • linux 中实现部分取反
     001、测试文件(实现仅提取==1185==和其他不包含==数字==的行)[root@pc1test2]#lsa.txt[root@pc1test2]#cata.txt##测试文件==1185==abcadoiafa==1120==asvgaojfajsdfja==3875==yuerdded==1130==afsdalj==1185== 002、sed实现[root@pc1test2]#ls......
  • 布尔数据 BOPDS_Iterator
    布尔数据[email protected]中新的布尔工具TKBO相对已经废弃的TKBool代码更规范,更易于理解。与ModelingData和ModelingAlgorithms大的模块组织一样,主要也是数据结构DataStructure+算法Algorithm的组织形式。其中BOPDS为布尔中的数据结构......
  • 代码随想录算法训练营-回溯算法-2|55. 跳跃游戏、45. 跳跃游戏 II、1005. K 次取反后
    55. 跳跃游戏1.跳跃的覆盖范围。这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!2. 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。时间复杂度:O(n)空间复杂度:O(1)1classSolution:2defca......
  • #yyds干货盘点#SQL注入之布尔注入原理
    布尔注入定义及原理:所谓盲注就是在服务器没有错误回显的时候完成注入公鸡。盲注分为布尔盲注和时间盲注布尔盲注:boolean根据注入信息返回trueorfales没有任何报错信息时间盲注:界面返回值ture无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过查看web页面返回......
  • 20-布尔值-比较运算符-逻辑运算符-短路问题
            ......
  • BooleanQuery
         ......
  • Go 语言内置类型全解析:从布尔到字符串的全维度探究
    关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。本文深入探讨了Go语言的内......
  • BOOL CALLBACK PromptProc(){} 这种符合c++ 的函数定义 格式吗?
       在C++中,函数的定义确实是由返回类型、函数名和参数列表组成的。但是在某些特殊的情况下,例如回调函数的定义,我们可能会看到类似于BOOLCALLBACKPromptProc(HWNDhwndDlg,UINTmessage,WPARAMwParam,LPARAMlParam)这样的函数定义。BOOLCALLBACK在这种情况下被用......
  • JavaScript中的布尔值
    布尔值代表真或假,开或关,是或否。在这个类型中只有两个值:true和false。JavaScript中的布尔值通常是比较操作的结果。例如:a===4上面的代码测试变量a的值是否等于数字4。如果是,返回true;否则返回false。布尔值在JavaScript的控制结构中经常被使用。例如,在if/else语句中,当布尔值......