2009-12-25 9 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 정말 45
는 왜 예외를 throw하지 않습니다 반환?

답변

6

왜 예외가 발생할 것으로 예상됩니까?

기본적으로 C# 코드는 unchecked이며 오버플로 등은 무시됩니다. 이 설정에 대한 현재 프로젝트 설정은 프로젝트 속성, 빌드 탭으로 이동 한 다음 탭 내용에서 고급 버튼을 클릭하여 확인할 수 있습니다. 나타나는 대화 상자에서 "산술 오버플로/언더 플로우 검사"가 있어야합니다. 이 설정은 기본적으로 선택 취소되어 있습니다.

이 경우, 포인터 캐스팅을 통해 c로 이동하면 32 비트 (4 바이트) int 값 x의 첫 번째 바이트가 증가하고 300을 증가시킵니다.

이렇게하면 256 번 증가하므로 0이되고 다시 44가됩니다.

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

당신은 얻을 것이다 :

B = 0

는 1에서 시작하기 때문에, 45

가 가

쉽게 다음 코드를 실행하여이를 테스트 할 수 있습니다 지금

오버플로 예외가 아닙니다.

이 모든 것을 말하면 실제로 포인터가 필요할 때까지 포인터와 안전하지 않은 코드를 사용하지 않아야합니다.

+0

"기본적으로 C# 코드는 선택 취소되었습니다." 나는 정말로 그것을 몰랐다. 감사합니다. – Behrooz

관련 문제