标签: overflowexception

为什么不产生溢出异常?

我正在使用LinqPad测试一些东西,并惊讶于以下代码没有产生异常:

ulong lSmallValue = 5;
ulong lBigValue = 10;

ulong lDifference = lSmallValue - lBigValue;

Console.WriteLine(lDifference);
Console.WriteLine((long)lDifference);
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

18446744073709551611
-5
Run Code Online (Sandbox Code Playgroud)

幸运的是,我希望这种行为,但我认为这会导致OverflowException被抛出.

来自System.OverflowException:

在以下条件下,在运行时抛出OverflowException:

  • 算术运算产生的结果超出了操作返回的数据类型的范围.
  • 转换或转换操作尝试执行缩小转换,并且源数据类型的值超出目标数据类型的范围.

为什么操作不lSmallValue - lBigValue属于第一类?

c# overflowexception

5
推荐指数
1
解决办法
789
查看次数

为什么int.MinValue%-1导致和OverflowException

在7.8.3.关于剩余运算符的C#规范,它声明如下:

如果左操作数是最小的int或long值而右操作数是-1,则抛出System.OverflowException.

因此int.MinValue % -1会导致OverflowException.我想知道为什么?

c# overflowexception modulus

5
推荐指数
1
解决办法
76
查看次数

为什么添加结果大于int.MaxValue的两个大整数不会抛出溢出异常?

如果我们在程序中使用以下循环,则循环永远不会在C#4.0中结束

for (int i = 1; i <= int.MaxValue; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

这是因为向int.MaxValue(2147483647)添加1不会导致溢出异常,但会导致-2147483648(考虑到32位int和2的补充).

int i = int.MaxValue;
Console.WriteLine(i + 1);
Run Code Online (Sandbox Code Playgroud)

最近这种行为似乎发生了变化.请参阅算术操作导致OverflowException的问题.这可能是导致此更改的原因?

c# overflowexception

3
推荐指数
1
解决办法
1807
查看次数

如何在整数除法上停止抛出OverflowException?

我得到OverflowException异常的扔给我时,我不希望他们(或因此我认为).我正在执行一些奇怪的计算,我希望值溢出,丢弃溢出的位.看来我不能让这个工作正常.基本上这是一对i和j,当我迭代大集合(int.MinValue到int.MaxValue)时发生.

// i and j are ints
// i is -2147483648
// j is -1
var x = i / j;

// I also tried using unchecked keyword, but it doesn't help    
var x = unchecked(i / j);
Run Code Online (Sandbox Code Playgroud)

更新:

预期的数学值-2147483648/-1是2147483648.但是,这个特定的代码并没有真正尝试找到这个数字.这是一系列比特操纵事情的一部分,有点难以理解.说实话,我甚至不知道自己的目的是什么,因为我没有真正记录这个方法,而且只需要一天时间就可以在我脑海中引发严重的WTF泡沫.所有我知道它的工作原理与设计用于处理案例的特殊代码.

关于预期价值:

因为int只能保持2147483647的最大值,所以我希望丢弃溢出值Y值.

如果我对此有所了解,那么对于模糊方法来说,这可能是文档的重要性.

.net c# math overflowexception

2
推荐指数
1
解决办法
2914
查看次数

递归堆栈大小?

class Program  
{
    static void Main(string[] args)
    {
        Test(0);
    }

    static void Test(int i)
    {
        if (i > 30000)
        {
            return;
        }
        Test(i + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么在调用上面的示例时获取递归函数并抛出StackOverflowException.

(因为超过默认的递归堆栈大小?)

但我想知道如何解决这个问题.

谢谢.

c# recursion overflowexception

2
推荐指数
2
解决办法
4557
查看次数

C# - 什么可能导致溢出检查?

我习惯于C#不执行溢出检查,因为语言规范声明(§7.5.12):

对于未被任何已检查或未检查的运算符或语句包含的非常量表达式(在运行时计算的表达式),除非外部因素(如编译器开关和执行环境配置)要求,否则将取消选中默认溢出检查上下文检查评估.

在低级代码中执行数组边界检查时,我利用了这个优势:

if ((uint)index >= (uint)TotalCount)
    ...
Run Code Online (Sandbox Code Playgroud)

如果index是负数,我希望它变成一个大的正数,以便它超过TotalCount.但是,令我惊讶的是,负数会产生OverflowException,我必须将表达式包装在unchecked()中.我查看了Visual Studio中的项目选项,但没有看到启用或禁用溢出检查的选项.那么为什么它会在这里呢?

c# unchecked checked overflowexception

1
推荐指数
1
解决办法
208
查看次数

内存不足和溢出异常创建小数组

我是C#和XNA的新手.刚刚设法写了一个生成三角形网格的类.但是有一个问题.我可以得到最多27个节点长度的三角形.在28,它抛出内存不足异常和31 -overFlow异常.

我不明白它是如何溢出或内存不足...试图计算所有这些内存值,但它们看起来非常小.

它只是受变量影响的节点数组.Node类不是很大:

浮动x; 4 B浮动y; 4 B float z; 4 B int [] con; int [6] 4*6 = 24 B字节通过; 1 B颜色col; 32 b = 4 B.

            Total:  41B
Run Code Online (Sandbox Code Playgroud)

生成三角形所需的节点序列总和为n(n + 1)/ 2

28岁时内存不足

28*29/2 = 406个节点

总记忆:

41*406 = 16646 B = 16.26 kB

31:496节点的溢出为19.9 kB

我没有读到"内存不足异常"的文章,该结构的大小大于它似乎和内存不足的情况发生在500MB的大小......没有办法我的小三角形将达到这么大的规模.

这是我的全班:

class TriMatrix
    {
        int len;
        int Lenght;
        Node[] node;
        VertexPositionColor[] vertex;

        public class Node
        {
            public float x;
            public float y;
            public float z;
            public int[] con;
            public byte …
Run Code Online (Sandbox Code Playgroud)

c# arrays xna out-of-memory overflowexception

1
推荐指数
1
解决办法
444
查看次数