2009-05-06 5 views
7

나는 닷넷 프로그램에서 이상한 행동을 목격하고 있습니다 :.net Int64의 동작이 마치 Int32의 것처럼 동작하는 이유는 무엇입니까?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

왜 내 INT64의 동작합니다 Int64.MaxValue들이 64 비트를 사용하고 확인하는 것처럼 보이지만 그들이 INT32의는 것처럼?

이 관련이 있다면, 32 비트 OS를 사용하고, 전체 작업이 Int32 연산을 사용하여 수행되도록 대상 플랫폼은

답변

20

귀하의 RHS는 Int32 값을 사용한다 "모든 CPU"로 설정되어, Int32결과는으로 오랫동안 승격됩니다. 이것에

변경을 :

Int64 a = 256*256*256*128L; 

모두 잘 될 것입니다.

+1

젠장 당신이 존 소총! 당신은 약 10 초 정도 나를 때렸다! :) –

+0

나는 어리 석을 느낀다 :) 고마워! – Brann

+0

당신은 바보가 아니며 처음에는 조금 비현실적입니다. 나는 "double res = someInt/otherInt"가 부동 소수점 나누기를 수행하고 왼쪽 사이드가 중요하지 않다는 것을 알았을 때 그때까지 물었다. –

4

사용 :

Int64 a = 256L*256L*256L*128L; 

하는 L 접미사가 INT64 리터럴 의미는 접미사가 INT32을 의미합니다.

은 무엇 당신은 썼다 :

Int64 a = 256*256*256*128 

의미 :

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

대문자 확장자'L'은 더 쉽게 인식 할 수 있기 때문에 추천되며 일부 글꼴에서는 '1'과 'l'을 구별 할 수 없습니다 –

관련 문제