怎么会发生这种情况?

时间:2009-12-25 21:13:35

标签: c# pointers

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

它确实返回了45.
为什么不抛出任何例外?

1 个答案:

答案 0 :(得分:6)

为什么你会期望它抛出异常?

默认情况下,C#代码为unchecked,这意味着溢出等只是默默地被忽略。您可以通过转到项目属性,构建选项卡,然后单击选项卡内容中的“高级”按钮来查找此设置的当前项目设置。在出现的对话框中,您应该有一个“检查算术溢出/下溢”。默认情况下,此设置未选中。

在这种情况下,你通过一个转换为c的指针递增32位(4字节)int值x的第一个字节,并且你将它递增300次。

这会增加256次,这会导致它回到0,然后再增加44次。从1开始,它现在是45。

您可以通过执行以下代码轻松测试:

Byte b = 255;
b++;
Console.Out.WriteLine("b=" + b);

你会得到:

  

B = 0

不是溢出异常。

说了这么多,你可能不应该使用指针和不安全的代码,直到你确实需要它。