这怎么会发生?
问题描述:
struct a { public int x; }
struct c { public byte x; }
unsafe class Program
{
static void Main(string[] args)
{
a V = new a();
V.x = 1;
c* b = (c*)(void*)&V;
for(int n = 0;n != 300;n++) b->x++;
Console.WriteLine(V.x);
Console.ReadKey(true);
}
}
真的返回45
为什么没有抛出任何异常?这怎么会发生?
答
你为什么期望它抛出异常?
默认情况下,C#代码是unchecked,这意味着溢出等仅仅被忽略。您可以通过转到项目属性,构建选项卡,然后单击选项卡内容中的高级按钮来找到此设置的当前项目设置。在出现的对话框中,您应该有一个“检查算术溢出/下溢”。此设置默认未选中。
在这种情况下,您将通过投射为c的指针递增32位(4字节)的int值x的第一个字节,并将其递增300次。
这增加了256倍,这导致它回到0,然后又是44倍。由于它开始于1,现在是45
您可以轻松地执行以下代码测试:
Byte b = 255;
b++;
Console.Out.WriteLine("b=" + b);
您将获得:
B = 0
不是溢出异常。在说了这么多之后,你可能不应该使用指针和不安全的代码,除非你确实需要它。
“默认情况下,C#代码未被选中。”我真的不知道。谢谢。 – Behrooz 2009-12-25 21:22:36