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);
}
}
Run Code Online (Sandbox Code Playgroud)
45
它确实返回45.
为什么不抛出任何例外?
为什么你会期望它抛出异常?
默认情况下,C#代码未选中,这意味着溢出等只是默默地被忽略.您可以通过转到项目属性,构建选项卡,然后单击选项卡内容中的"高级"按钮,找到此设置的当前项目设置.在出现的对话框中,您应该有一个"检查算术溢出/下溢".默认情况下,此设置未选中.
在这种情况下,你通过一个转换为c的指针递增32位(4字节)int值x的第一个字节,并且你将它递增300次.
这会使其增加256次,从而使其返回0,然后再增加44次.从1开始,它现在是45.
您可以通过执行以下代码轻松测试:
Byte b = 255;
b++;
Console.Out.WriteLine("b=" + b);
Run Code Online (Sandbox Code Playgroud)
你会得到:
B = 0
不是溢出异常.
说了这么多,你可能不应该使用指针和不安全的代码,直到你真正需要它.
归档时间: |
|
查看次数: |
126 次 |
最近记录: |