명시 적으로 내 변수를 캐스팅 한 다음 더하기 연산자를 사용하지만 여전히 44를 반환합니다. 내 변수가 int로 명시 적으로 변환되는 이유를 알고 싶습니다.sum_tum 변수에 캐스팅 된 값을 int로 변환합니다.
byte b = 100;
b = (byte)(b +200);
왜 내 결과는 255입니까?
byte b = 100;
b = (byte)(b + 155);
명시 적으로 내 변수를 캐스팅 한 다음 더하기 연산자를 사용하지만 여전히 44를 반환합니다. 내 변수가 int로 명시 적으로 변환되는 이유를 알고 싶습니다.sum_tum 변수에 캐스팅 된 값을 int로 변환합니다.
byte b = 100;
b = (byte)(b +200);
왜 내 결과는 255입니까?
byte b = 100;
b = (byte)(b + 155);
하자 분할이 최대 :
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됩니다.
- 확인되지 않은 컨텍스트에서 변환은 항상 성공하고 다음과 같이 진행됩니다.
- 원본 형식이 대상 형식보다 큰 경우 원본 값은 "여분"최상위 비트를 버림으로써 잘립니다. 결과는 대상 유형의 값으로 처리됩니다.
마지막 총알이 여기에 무슨 일이 일어나고 있는지 정확히있다.
의 결과가 "100 + 200"(300) (300) (이를 행 캐스팅 된) 바이트로 들어갈 수없는, 그래서 높은 비트가 폐기되기 때문에 - 44
함께 떠나는당신은 무엇을 기대 했습니까?
오버플로가 발생합니다. 300-256의 바이트 값 = 44 – Tomtom