zoukankan      html  css  js  c++  java
  • C语言的unsigned做双目运算符的奇怪问题

    首先看代码:

    #include <stdio.h>
    
    void main()
    {
        int num1 = 1;
        unsigned int num2 = 2;
        if (num1 - num2 > 0)
        {
            printf("%d-%d=%d,大于0", num1, num2, num1 - num2);
        }
        else
        {
            printf("%d-%d=%d,小于0", num1, num2, num1 - num2);
        }
    }

    以为会输出这个结果:

    1-2=-1,小于0

    错了。。运行结果如下

    1-2=-1,大于0

    再看C#的的运算结果

     static void Main(string[] args)
            {
                int num1 = 1;
                uint num2 = 2;
                if (num1 - num2 > 0)
                {
                    WriteLine($"num1-num2={num1 - num2},大于0");
                }
                else
                {
                    WriteLine($"num1-num2={num1 - num2},小于0");
                }
                Console.ReadKey();
            }

    输出结果:

    num1-num2=-1,小于0

    C#的运算结果与期待结果一致。

    原来C语言在做两个数加减的时候,是按照其中一个更严格的数据类型来计算的。所以当int和unsigned int运算的时候,会转换为unsigned int来运算。

    printf("%d-%d=%d,大于0", num1, num2, num1 - num2);
    //将上面的的代码修改为
    printf("%d-%d=%u,大于0", num1, num2, num1 - num2);

    得到输出结果:

    1-2=4294967295,大于0

    4294967295太大了不方便分析,我们将它转换为16进制:FFFFFFFF,刚好是-1的补码。。

    所以if语句中的num1-num2,得出来的是num1-num2的补码也就是FFFFFFFF,满足大于0。。。

    
    
    
  • 相关阅读:
    Error Boundaries 错误边界
    判断机型
    iframe
    C#中静态方法和非静态方法的区别
    C#制作ActiveX控件中调用海康SDK的问题
    C# 程序集
    web deploy 部署网站
    C# 提取PPT文本和图片的实现方案
    C#调用webservice
    C#中四步轻松使用log4net记录本地日志
  • 原文地址:https://www.cnblogs.com/Serialport/p/11547329.html
Copyright © 2011-2022 走看看