我有這樣的方法:
void Method(short parameter)
{
short localVariable = 0;
var result = localVariable - parameter;
}
爲什麼結果的Int32
,而不是一個Int16
?
我有這樣的方法:
void Method(short parameter)
{
short localVariable = 0;
var result = localVariable - parameter;
}
爲什麼結果的Int32
,而不是一個Int16
?
這不僅僅是減法,它只是不存在短的(或字節/ 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++保持兼容。
我認爲它做自動完成,以避免溢出,
可以說你做這樣的事情。
Short result = Short.MaxValue + Short.MaxValue;
結果顯然不適合在短期內。
我不明白的一件事是爲什麼不爲int32也做它會自動轉換爲長?
默認情況下,在計算之前,所有具有小於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。)
這個線程內,給定其他的答案,以及這裏給出的討論是有啓發:
(1)Why is a cast required for byte subtraction in C#?
(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這整個討論...
你所看到的效果...
short - short = int
...是在這個問題#2廣泛討論:[link] byte + byte = int… why?
有很多的好信息和一些有趣的討論至於它爲什麼這樣。
這裏是「頂部投票」的答案:
我相信這是基本的緣故性能 。 (在條款「爲何 發生在所有」,那是因爲有 是不是C#爲 算術與字節,爲sbyte,短期或 USHORT定義的任何運營商,正如其他人所說,這 答案是,爲什麼那些運算符 未定義。)
處理器有原生操作,以 算術運算,32位非常快, 。自動完成 從結果到字節 的轉換會自動完成,但是 會導致 情況下的性能損失,其中您實際上不需要 該行爲。
- 喬恩長柄水杓
享受,
羅伯特C.Cartaino
順便說一句:這是正確的不定冠詞? 「an」還是「a」? – 2009-07-05 19:31:31
任何類型T的兩個值的加法和減法都可以給出不適合T類型的結果。另請參見此問題:http://stackoverflow.com/questions/927391/why-is-a-cast-required -for-byte-subtraction-in-c – schnaader 2009-07-05 19:33:28
這與http://stackoverflow.com/questions/941584實際上是一樣的,只是使用不同的類型和不同的操作符。 – 2009-07-05 19:34:04