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。。。


 

posted on 2019-09-19 10:25  名字还没想好  阅读(263)  评论(0编辑  收藏  举报