首先看代碼: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。。。