2014-01-28 5 views
3
자바에서

은 "선택 해제"문/연산자를 사용하고, "확인"경우에 사용되는 경우 동작은 동일 할 것이다 x = 0 인 (int/(1.0/x)) 결과가 Int32.MaxValue가 아닌 In32.MinValue가되는 이유는 무엇입니까?

int x = 0; 
(int)(-1.0/x) -> Int32.MinValue 
(int)(1.0/x) -> Int32.MinValue!! 

int x = 0; 
(int)(-1.0/x) -> Integer.MinValue 
(int)(1.0/x) -> Integer.MaxValue 

그러나 C#에서

는 대신 다음 그것의 오버 플로우 예외.

그러나 확인되지 않은 컨텍스트에서는 1.0/x (x = 0)를 제외하고 Int32.MaxValue가 아니라 Int32.MaxValue가됩니다.

나는 뭔가를 놓친가요?

+7

왜냐하면'C# '은'Java'가 아니기 때문입니다. –

+1

@ Selman22 둘 다 int 사양에 따르지 않고 int 연산에 대한 IEEE 사양을 따릅니다. – Servy

+0

(int) (1.0/x)는 나에게 Int32.MaxValue를 제공합니다. – Tarec

답변

10

일 것입니다. 는 C# 스펙, 6.2.1 (강조 내)에서 : 일체형으로 float 또는 double로부터 변환

[...]. - 확인되지 않은 컨텍스트에서 변환은 항상 성공하고 다음과 같이 진행됩니다. - 피연산자의 값이 NaN 또는 무한대 인 경우 변환의 결과는 대상 유형의 입니다.

일체형 T에 부동 소수점 수의 축소 변환은 두 단계를 필요 :

자바 규격 section 5.1.3에 있는지 비교하여 첫 번째 단계에서는

을 플로팅 -point 수는 다음과 같이 T가 long 인 경우 long으로, T가 byte, short, char 또는 int 인 경우 int로 변환됩니다.

  • float 시작점 번호가 NaN (§4.2.3) [...]이면 변환의 첫 번째 단계의 결과는 int 또는 long 0입니다.
  • 그렇지 않으면 부동 소수점 숫자가 무한대가 아닌 경우 [
    • 값이 너무 작은 (큰 크기 또는 음의 무한대의 음의 값)이어야하고, 제 1 단계의 결과이다 : ...]
    • 그렇지 않으면, 다음의 두 가지 사례 중 하나가 참이어야 int 형 또는 long 형의 표현 가능한 최소의 값.
    • 값이 너무 커야합니다 (양의 값이 큰 양수 또는 양의 무한대). 첫 번째 단계의 결과는 int 유형 또는 long 유형의 가장 큰 표현 가능한 값입니다.그래서 기본적으로

, 두 언어가 서로 다른 보증을하고, 구현은 그 보장을 만족시키기 위해 모두 나타납니다.

은 더러운 사양의이므로 .NET JIT는보다 효율적인 변환을 사용할 수 있으므로 결과적으로 int.MinValue이 발생합니다.

7

C#의 동작은 정의되지 않습니다. C# Language Specification (및 this answer)에서 인용 :

를 일체형으로 플로트 또는 이중에서 전환에 대해, 처리는 변환이 일어나는 오버 플로우 상황 확인 (§7.6.12)에 의존한다. 확인되지 않은 컨텍스트에서 : 피연산자의 값이 NaN 또는 무한대 인 경우 변환 결과는 대상 유형의 지정되지 않은 값입니다.