鉴于这种代码:为什么不溢出?
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