C语言的unsigned作双目运算符的奇怪问题

首先看代码:ui

#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);
    }
}

觉得会输出这个结果:spa

1-2=-1,小于0code

错了。。运行结果以下blog

1-2=-1,大于0string

再看C#的的运算结果it

 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();
        }

输出结果:io

num1-num2=-1,小于0class

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

相关文章
相关标签/搜索