gpt4 book ai didi

c# - 为什么这个经过检查的计算不会抛出 OverflowException?

转载 作者:行者123 更新时间:2023-11-30 12:45:11 28 4
gpt4 key购买 nike

有人可以解释以下行为吗:

    static void Main(string[] args)
{
checked
{
double d = -1d + long.MinValue; //this resolves at runtime to -9223372036854780000.00
//long obviousOverflow = -9223372036854780000; //compile time error, '-' cannot be applied to operand of tpye ulong -> this makes it obvious that -9223372036854780000 overflows a long.
double one = 1;
long lMax = (long)(one + long.MaxValue); // THROWS
long lMin = (long)(-one + long.MinValue); // THEN WHY DOES THIS NOT THROW?
}
}

我不明白为什么我在最后一行代码中没有得到 OverFlowException

更新 更新了代码以明确在将 double 类型转换为 long 类型时 checked 通过,但最后一种情况除外。

最佳答案

您正在使用 double 值 (-1d) 进行计算。 float 不会在 .NET 上抛出。 checked 对它们没有任何影响。

但是返回到long 的转换受checked 的影响。 one + long.MaxValue 不在 double 的范围内。 -one + long.MinValue 确实适合该范围。原因是有符号整数的负数多于正数。 long.MinValue 没有正等价物。这就是为什么您的代码的负版本恰好适合而正版本不适合的原因。

加法操作不会改变任何东西:

Debug.Assert((double)(1d + long.MaxValue) == (double)(0d + long.MaxValue));
Debug.Assert((double)(-1d + long.MinValue) == (double)(-0d + long.MinValue));

我们正在计算的数字超出了 double 的精确范围。 double 可以精确地容纳 2^53 以内的整数。我们这里有舍入误差。加一等于加零。本质上,您是在计算:

var min = (long)(double)(long.MinValue); //does not overflow
var max = (long)(double)(long.MaxValue); //overflows (compiler error)

添加操作是一个转移注意力的操作。它不会改变任何东西。

关于c# - 为什么这个经过检查的计算不会抛出 OverflowException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605603/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com