Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';这不是溢油吗?_C#_.net_Visual Studio_Int_Integer Overflow - Fatal编程技术网

C# 为什么';这不是溢油吗?

C# 为什么';这不是溢油吗?,c#,.net,visual-studio,int,integer-overflow,C#,.net,Visual Studio,Int,Integer Overflow,鉴于此代码: 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可以容纳−32768至+32767。为什么这不会导致溢出? 类型:int 范围:-2147483648到2147483647因为Int是32位的,保存的值高达±2GB。在C#中,In

鉴于此代码:

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可以容纳−32768至+32767。为什么这不会导致溢出?

类型:int
范围:-2147483648到2147483647

因为Int是32位的,保存的值高达±2GB。

在C#中,Int是4个字节。因此它的最大值为2^31或2147483648。如果您想要一个2字节的整数,请使用short而不是int。

int的大小是4字节,因此它至少可以容纳2^31,大约是20亿。

关键字映射到.NET Framework,它可以容纳-2147483648到2147483647之间的整数。

在C#int(System.Int32)中是32位的,可以愉快地存储此值。

因为.NET中的int是一个有符号的32位数字,其范围为-2147483648到2147483647


参考:

您可以将结果打印为“WTF?”。那么它应该如何显示其他值

Int表示int32,其范围为–2147483648至2147483647 您得到的范围为int16:–32768到32767


这就是它没有抛出任何错误的原因

虽然大家都正确地说32位机器上的“int”类型很可能是2^32,但您的方法中存在一个明显的缺陷

让我们假设int是16位的。您分配的值将溢出z,因此z本身溢出。当您计算x+y时,您也会溢出int类型,很可能这两种情况都会溢出到相同的值,这意味着您无论如何都会达到相等(这可能取决于编译器,我不太确定x+y是否会被提升)

进行实验的正确方法是,z的数据类型比x和y的数据类型大。例如(很抱歉,简单的C语言,我不太喜欢C语言。不过,希望它能说明方法论。)


比较sum和z很重要,因为比较x+y和z可能仍然很好,这取决于编译器处理升级的方式。

首先,您的代码在int。。。然而,如果它不在范围内,那么它也不会抱怨。。。因为在if检查中执行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; 
intx=200000//在你的代码里是20000
int y=200000//在你的代码里是20000
int z=40000;
//为什么要打印WTF?40000>32767不是吗?
//注:X+Y=200000且不小于32767
//将通过编译器,因为您没有赋值,并且值作为long进行比较
//由于它不等于40000,WTF没有打印出来
如果((x+y)==z)控制台写入线(“WTF”);
//并且x*y>=z是真的,因为它被打印出来了
如果((x*y)>=z)Console.WriteLine(“WTF乘法”);
//编译器将失败,因为x不能容纳40,00,00,00000
x=x*y;
在C#中,类型映射到类型,该类型始终是32位有符号的

即使使用,它也不会溢出,因为默认情况下,
short
+
short
返回一个。如果将此
int
强制转换为
short
-
(short)(x+y)
,则会得到一个溢出值。不过你不会有例外。您可以使用行为获取异常:

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));
        }
    }
}

您可以在MSDN上找到有关(和)的信息。它基本上归结为性能,因为检查溢出比忽略溢出要慢一点(这就是为什么默认行为通常是
未选中的原因,但我打赌在某些编译器/配置中,在第一次
z
赋值时会出现异常。)

然而,上述所有情况都是正确的,重要的是要知道,如果分配的数字大于2^32,它将无法编译

32位机器中的int大部分时间是4字节。您是否尝试打印出“x+y”,然后打印出z?可能它们都被存储为相同的负数。C#中的int始终是32位。哇,8个人的回答基本相同,贝洛维希望所有比原始正确答案晚发布的人删除多余的答案…因为答案不完整,所以被否决。请参阅描述检查算术的答案。原始问题的答案是完整的(为什么没有溢出)。所以在我看来,否决票是错误的。但是,请对您喜欢的解决方案进行一次向上投票。+1我只想在这里添加Scoregraphic的链接,以使其成为一个完整而出色的答案。感谢您的提示,我添加了一些指向Int32、int和short types=)的链接,这是一个很棒的C示例。事实上,我是从一个C类人的博客上得到这个消息的,但我在C#中问了这个问题,因为我们开了,结果是一样的。
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));
        }
    }
}