2009-07-05 52 views
9

可能重複:
byte + byte = int… why?爲什麼從Int16變量Int32中減去Int16參數的結果?

我有這樣的方法:

void Method(short parameter) 
{ 
    short localVariable = 0; 
    var result = localVariable - parameter; 
} 

爲什麼結果的Int32,而不是一個Int16

+0

順便說一句:這是正確的不定冠詞? 「an」還是「a」? – 2009-07-05 19:31:31

+0

任何類型T的兩個值的加法和減法都可以給出不適合T類型的結果。另請參見此問題:http://stackoverflow.com/questions/927391/why-is-a-cast-required -for-byte-subtraction-in-c – schnaader 2009-07-05 19:33:28

+2

這與http://stackoverflow.com/questions/941584實際上是一樣的,只是使用不同的類型和不同的操作符。 – 2009-07-05 19:34:04

回答

11

這不僅僅是減法,它只是不存在短的(或字節/ sbyte)算術。

short a = 2, b = 3; 
short c = a + b; 

會給出錯誤,它不能轉換INT(A + B)短(C)。

還有一個原因幾乎從不使用短。

附加說明:在任何計算中,short和sbyte將總是'加寬'爲int,ushort和byte爲uint。這種行爲可以追溯到K &R C(並且probaly甚至比這更早)。

這個(舊)的原因是,處理字符時出現afaik,效率和溢出問題。最後一個原因對於C#不再那麼強大,char是16位,並且不能隱式轉換爲int。但非常幸運的是,C#數字表達式在很大程度上與C和C++保持兼容。

1

我認爲它做自動完成,以避免溢出,

可以說你做這樣的事情。

Short result = Short.MaxValue + Short.MaxValue; 

結果顯然不適合在短期內。

我不明白的一件事是爲什麼不爲int32也做它會自動轉換爲長?

7

默認情況下,在計算之前,所有具有小於Int32的整數的運算都會擴展爲32位。 Int32的結果之所以簡單,是因爲它在計算之後保持原樣。如果您檢查MSIL算術操作碼,則它們操作的唯一整數數字類型是Int32和Int64。這是「按設計」。

如果您希望以Int16格式返回結果,那麼如果您在代碼中執行強制轉換,或者編譯器(低調地)在「引擎蓋下」發出轉換,則無關緊要。

另外,上面的例子中可以很容易地與鑄

short a = 2, b = 3; 

short c = (short) (a + b); 

的兩個數字將擴大到32位解決,得到相減,然後截斷回16位,這是MS打算如何它是。

使用短(或字節)的優點是主要存儲在情況下,你有大量的數據(圖形數據,流媒體等)

P.S.哦,這篇文章對於發音以輔音開始的單詞是「a」,對於其發音形式以元音開頭的單詞是「an」。一個數字,AN int。)

3

這個線程內,給定其他的答案,以及這裏給出的討論是有啓發:

(1)Why is a cast required for byte subtraction in C#?

(2)byte + byte = int… why?

(3)Why is a cast required for byte subtraction in C#?

但是隻是爲了拋出另一個摺痕,它可以取決於你使用哪些操作符。對於各種數字類型,增量(++)和減量( - )運算符以及加法賦值(+ =)和減法賦值( - =)運算符都被重載,並且它們執行轉換結果的額外步驟返回結果時返回操作數的類型。

例如,使用短:

short s = 0; 

s++;    // <-- Ok 
s += 1;    // <-- Ok 
s = s + 1;   // <-- Compile time error! 
s = s + s;   // <-- Compile time error! 

使用字節:

byte b = 0; 

b++;    // <-- Ok 
b += 1;    // <-- Ok 
b = b + 1;   // <-- Compile time error! 
b = b + b;   // <-- Compile time error! 

如果他們沒有做這種方式,利用增量運算符調用(++)是不可能的,呼叫附加分配操作員最多隻會感到尷尬,例如:

short s 
s += (short)1; 

無論如何,只是另一個PECT這整個討論...

1

你所看到的效果...

short - short = int 

...是在這個問題#2廣泛討論:[link] byte + byte = int… why?

有很多的好信息和一些有趣的討論至於它爲什麼這樣。

這裏是「頂部投票」的答案:

我相信這是基本的緣故性能 。 (在條款「爲何 發生在所有」,那是因爲有 是不是C#爲 算術與字節,爲sbyte,短期或 USHORT定義的任何運營商,正如其他人所說,這 答案是,爲什麼那些運算符 未定義。)

處理器有原生操作,以 算術運算,32位非常快, 。自動完成 從結果到字節 的轉換會自動完成,但是 會導致 情況下的性能損失,其中您實際上不需要 該行爲。

- 喬恩長柄水杓

享受,

羅伯特C.Cartaino