这怎么会发生?

问题描述:

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

不是溢出异常。在说了这么多之后,你可能不应该使用指针和不安全的代码,除非你确实需要它。

+0

“默认情况下,C#代码未被选中。”我真的不知道。谢谢。 – Behrooz 2009-12-25 21:22:36