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

相關文章
相關標籤/搜索