我正在使用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被抛出.
在以下条件下,在运行时抛出OverflowException:
- 算术运算产生的结果超出了操作返回的数据类型的范围.
- 转换或转换操作尝试执行缩小转换,并且源数据类型的值超出目标数据类型的范围.
为什么操作不lSmallValue - lBigValue属于第一类?
在7.8.3.关于剩余运算符的C#规范,它声明如下:
如果左操作数是最小的int或long值而右操作数是-1,则抛出System.OverflowException.
因此int.MinValue % -1会导致OverflowException.我想知道为什么?
如果我们在程序中使用以下循环,则循环永远不会在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的问题.这可能是导致此更改的原因?
我得到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值.
如果我对此有所了解,那么对于模糊方法来说,这可能是文档的重要性.
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#不执行溢出检查,因为语言规范声明(§7.5.12):
对于未被任何已检查或未检查的运算符或语句包含的非常量表达式(在运行时计算的表达式),除非外部因素(如编译器开关和执行环境配置)要求,否则将取消选中默认溢出检查上下文检查评估.
在低级代码中执行数组边界检查时,我利用了这个优势:
if ((uint)index >= (uint)TotalCount)
...
Run Code Online (Sandbox Code Playgroud)
如果index是负数,我希望它变成一个大的正数,以便它超过TotalCount.但是,令我惊讶的是,负数会产生OverflowException,我必须将表达式包装在unchecked()中.我查看了Visual Studio中的项目选项,但没有看到启用或禁用溢出检查的选项.那么为什么它会在这里呢?
我是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)