鑑於這種代碼:爲什麼不溢出?
int x = 20000;
int y = 20000;
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
if ((x + y) == z) Console.WriteLine("WTF?");
,知道int可以支持-32,768到+32,767。爲什麼這不會導致溢出?
鑑於這種代碼:爲什麼不溢出?
int x = 20000;
int y = 20000;
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
if ((x + y) == z) Console.WriteLine("WTF?");
,知道int可以支持-32,768到+32,767。爲什麼這不會導致溢出?
在C#中,int
類型被映射到Int32
類型,這始終是32位,簽名。
即使您使用short
,它仍然不會溢出,因爲short
+ short
默認情況下會返回int
。如果您將此int
轉換爲short
- (short)(x + y)
- 您將獲得溢出值。你不會得到一個例外。您可以使用checked
行爲得到一個例外:
using System;
namespace TestOverflow
{
class Program
{
static void Main(string[] args)
{
short x = 20000;
short y = 20000;
short z;
Console.WriteLine("Overflowing with default behavior...");
z = (short)(x + y);
Console.WriteLine("Okay! Value is {0}. Press any key to overflow " +
"with 'checked' keyword.", z);
Console.ReadKey(true);
z = checked((short)(x + y));
}
}
}
您可以找到有關checked
(和unchecked
)MSDN上。它基本上可以歸結爲性能,因爲檢查溢出比忽視它(慢一點點,這就是爲什麼默認的行爲通常是unchecked
,但我敢打賭,在一些編譯器/配置,你會在第一z
分配得到一個異常。)
http://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx
類型:int 範圍:2,147,483,648到2,147,483,647
由於整數是32位,保持值可達±2GB。
在C#中,Int是4個字節。所以它最高可達2^31或2,147,483,648。如果你想要一個2字節的整數,使用一個短而不是int。
一個int的大小是4個字節,所以它可以保存至少2^31,大約20億。
int關鍵字映射到.NET Framework Int32 type,它可以保存範圍從-2,147,483,648到2,147,483,647的整數。
in C#int(System.Int32)是32位,可以愉快地存儲這個值。
因爲在.NET一個int是具有一定範圍的2,147,483,648一個符號32比特數到2,147,483,647。
參考:http://msdn.microsoft.com/en-us/library/5kzh1b5w(VS.80).aspx
您將得到打印結果爲 「跆拳道?」那麼它應該如何顯示其他價值。
詮釋意味着INT32其範圍爲-2147483648到2147483647 您將得到INT16範圍:-32768至32767
這是它不拋出任何錯誤
雖然每個人都在正確的原因說32位機器上的「int」類型最有可能是2^32,你的方法中存在明顯的缺陷。
我們假設int是16位。您正在分配一個會使z溢出的值,所以z本身溢出了。當你計算x + y時,你也會溢出int類型,這很有可能兩個case會溢出到相同的值,這意味着你會達到你的平等,無論(這可能是編譯器依賴,我不太確定是否x + y將被提升)。
做實驗的正確方法是使z具有比x和y更大的數據類型。例如(對不起,普通C,我沒有太多的C#的人。希望這說明的方法,但是。)
int x = INT_MAX;
int y = INT_MAX;
int sum = x + y;
long long z = INT_MAX+INT_MAX;
if(sum == z)
printf("Why didn't sum overflow?!\n");
比較總和和z是比較X + Y和Z可能還是出來很重要取決於編譯器如何處理提升。
首先你的代碼在int的範圍內......但是如果它不在範圍內,那麼它也不會抱怨......因爲你在做X + Y之後永遠不會把值賦給任何變量在你如果檢查...
假設,如果你在做X * Y,然後它會被計算,結果將是一個長期的值,然後從變量Z值被晉升爲長那麼這兩個將被比較。還記得鑄造從較低範圍的基元到較高範圍的基元值是隱含的。
int x = 200000; //In your code it was 20000
int y = 200000; //In your code it was 20000
int z = 40000;
// Why is it printing WTF? Isn't 40,000 > 32,767?
// Note: X + Y = 200000 and not < 32,767
// would pass compiler coz you are not assigning and values are compared as longs
// And since it's not equals to 40,000 the WTF did not got printed
if ((x + y) == z) Console.WriteLine("WTF?");
// And x * y >= z is true WTF MULTIPLY got printed
if ((x * y) >= z) Console.WriteLine("WTF MULTIPLY?");
// Compiler would fail since x can't hold 40,00,00,00,000
x = x * y;
所有上述是真實的,但是,要知道,如果你分配超過2^32的數是很重要的,它不會編譯!
INT中32位機是4個字節,大部分時間。 – 2009-07-14 05:41:38
您是否嘗試打印出「x + y」,然後打印出z?也許他們都被存儲爲相同的負數。 – MatrixFrog 2009-07-14 05:41:53
C#中的int是32位* always *。 – 2009-07-14 05:44:17