2013-08-06 41 views
12

看一看這個C代碼:INT推廣在C unsigned int類型和C#

int main() 
{ 
    unsigned int y = 10; 
    int x = -2; 
    if (x > y) 
     printf("x is greater"); 
    else 
     printf("y is greater"); 
    return 0; 
} 
/*Output: x is greater.*/ 

我明白爲什麼輸出x是更大,因爲當計算機比較他們兩個,x被晉升爲一個無符號整數類型。 當x被提升爲無符號整數時,-2變成65534,肯定大於10.

但是爲什麼在C#中,等效代碼是否會給出相反的結果呢?

public static void Main(String[] args) 
{ 
    uint y = 10; 
    int x = -2; 
    if (x > y) 
    { 
     Console.WriteLine("x is greater"); 
    } 
    else 
    { 
     Console.WriteLine("y is greater"); 
    } 
} 
//Output: y is greater. 
+11

因爲C#比較好? :D – lukegravitt

+1

我今天剛學到了一些關於C的新東西。我必須承認我不喜歡它。編譯器是否至少會發出警告? –

+2

[unsigned int(C++)vs uint(c#)]可能的重複(http://stackoverflow.com/questions/8266089/unsigned-int-c-vs-uint-c) – lukegravitt

回答

19

在C#中,既uintint比較之前得到提升到long

這是記錄在C#語言規範的4.1.5 Integral types

對於二元+, - ,*,/,%,&,^,|,= =,=,>,<,! > =和< =運算符,操作數轉換爲T類型,其中T是int,uint,long和ulong中的第一個,它們可以完全表示兩個操作數的所有可能值。然後使用類型T的精度執行操作,結果的類型是T(或關係運算符爲bool)。不允許一個操作數是long類型,另一個操作數是二元運算符類型的ulong。

由於long是一個可以完全代表所有intuint值第一類型,變量都被變換爲long,然後進行比較。

0

C和C#有什麼整型表示不同意見。關於C的觀點,請參閱我的回答https://stackoverflow.com/a/18796084/363751。在C#中,整數是表示數字還是抽象代數環的成員在某種程度上由「checked arithmetic」打開還是關閉決定,但是它只是控制超出邊界的計算是否應該拋出異常。一般而言,.NET框架將所有整數類型視爲表示數​​字,並且除了允許執行一些外部邊界計算而不會拋出異常外,C#還會繼續發揮其作用。

如果無符號類型表示代數環的成員, -5到無符號2應該產生一個無符號的值,當加到5時,它將產生2.如果它們代表數字,那麼如果可能的話,將-5加到無符號2應該產生-3的表示。由於將操作數提升爲Int64將允許發生這種情況,這就是C#所做的事情。順便說一下,我不喜歡操作符(特別是關係操作符!)應該總是通過將它們的操作數提升爲一個通用兼容類型來工作的觀​​點,應該返回該類型的結果,並且應該接受,而不用大聲疾呼任何能夠組合操作符的組合被提升爲普通類型。鑑於float f; long l;,存在用於比較f==l [它可以投l浮動,它可以投lfdouble,或者它可以確保f是可以轉換爲long的整數,並且,至少有三個顯含義當投的時候等於l]。或者,編譯器可以簡單地拒絕這種混合比較。如果我通過druthers的話,編譯器將被禁止將操作數投向關係運算符,除非只有一個合理的含義。要求在所有地方都可以隱式轉換的東西必須是直接可比的,恕我直言,這是無益的。

相關問題