2013-03-03 4 views
1

명시 적으로 내 변수를 캐스팅 한 다음 더하기 연산자를 사용하지만 여전히 44를 반환합니다. 내 변수가 int로 명시 적으로 변환되는 이유를 알고 싶습니다.sum_tum 변수에 캐스팅 된 값을 int로 변환합니다.

byte b = 100; 
b = (byte)(b +200); 

왜 내 결과는 255입니까?

byte b = 100; 
b = (byte)(b + 155); 
+0

오버플로가 발생합니다. 300-256의 바이트 값 = 44 – Tomtom

답변

7

하자 분할이 최대 :

byte b = 100; 
int tmp = (int) b + (int) 200; 
b = (byte) b; 

지금 tmp 300의 값을 갖게됩니다 ...하지만 그건 byte로서 표현할 수 없습니다. 당신이 (검사되지 않은 상황에서) byte에 캐스팅하는 경우가 44

는 C# 5 규격의 관련 비트로 끝날 것, 섹션 6.2.1 :

명시 적 숫자 변환이 가능한 정보가 손실 또는 예외가 발생할 가능성이 있습니다. 다음과 같이 명시적인 수치 변환 처리되어 서로 일체형으로 일체형로부터 변환

  • , 처리는 변환이 일어나는 오버 플로우 검사 컨텍스트 (§7.6.12)에 따라 달라
    • 확인 된 컨텍스트에서 원본 피연산자의 값이 대상 형식의 범위 내에 있으면 변환이 성공하지만 원본 피연산자의 값이 대상 형식의 범위 밖에 있으면 System.OverflowException이 throw됩니다.
    • 확인되지 않은 컨텍스트에서 변환은 항상 성공하고 다음과 같이 진행됩니다.
      • 원본 형식이 대상 형식보다 큰 경우 원본 값은 "여분"최상위 비트를 버림으로써 잘립니다. 결과는 대상 유형의 값으로 처리됩니다.

마지막 총알이 여기에 무슨 일이 일어나고 있는지 정확히있다.

1

의 결과가 "100 + 200"(300) (300) (이를 행 캐스팅 된) 바이트로 들어갈 수없는, 그래서 높은 비트가 폐기되기 때문에 - 44

함께 떠나는

당신은 무엇을 기대 했습니까?

관련 문제