2009-12-25 54 views
1
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
爲什麼沒有拋出任何異常?這怎麼會發生?

回答

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

不是溢出異常。在說了這麼多之後,你可能不應該使用指針和不安全的代碼,除非你確實需要它。

+0

「默認情況下,C#代碼未被選中。」我真的不知道。謝謝。 – Behrooz 2009-12-25 21:22:36