문제
이
int i = 2147483647;
var n = i + 3;
i = n;
Console.WriteLine(i); // prints -2147483646 (1)
Console.WriteLine(n); // prints -2147483646 (2)
Console.WriteLine(n.GetType()); // prints System.Int32 (3)
나는 혼란으로 다음
- (1)어떻게 int 값 -2147483646?(int 범위=-2,147,483,648 을 2,147,483,647)
- (2)이 인쇄 -2147483648 지 2147483648(컴파일러야 더 나은 결정 유형으로 int 범위 초과)
- (3)로 변환될 경우,어딘가 왜 n.GetType()시스템을 제공합.Int32 ?
Edit1: 만든 교정:지금 당신은 당신을 얻을 것이 무엇인데.(미안해)
var n=i+1;하기
var n=i+3;
Edit2: 한가지 더는 경우,그것으로 오버플로 왜 예외가 발생하지 않?
또한: 으로 오버플로우가 발생은 그것을 옳지 않을 설정하는 형식
var n
에서 문의 var n = i + 3;
다른 유형에 따라?
당신은 제안이 더 나은 제목이 되고 있지 않습니다....나는 적어도
감사
해결책
업데이트: 포스터는 그의 질문을 수정했습니다.
1) 3에 3에 int.maxValue를 추가하여 오버플로를 유발하기 때문에 출력이 예상됩니다. .NET에서 기본적으로 이것은 검사되지 않은 코드의 법적 작업이지만 음수 값에 대한 랩 어라운드를 제공하지만 추가하는 경우 checked
코드 주위를 차단합니다 OverflowException
대신에.
2) 선언 된 변수의 유형 var
런타임이 아닌 컴파일 시간에 결정됩니다. 두 개의 int32를 추가하면 UINT32가 아닌 int32, int64 또는 다른 것을 제공하는 규칙입니다. 따라서 런타임에도 INT32에 비해 결과가 너무 크다는 것을 알 수 있지만 여전히 INT32를 반환해야합니다.
3) 다른 유형으로 변환되지 않습니다.
다른 팁
1) -2147483646 is bigger than -2,147,483,648
2) 2147483648 is out of range
3) int is an alias for Int32
1)
첫째,변수의 값이지 않 -2147483646,그것은 -2147483648.테스트를 다시 실행하고 그 결과를 확인합니다.
아무 이유도 없는 것 int 을 보유 할 수 없습 값 -2147483646.그것의 범위 내에서 -2147483648..서 2,147,483,647.
2)
컴파일러를 선택하는 데이터의 유형 변수를 유형의 식의 결과.식 int 값을 반환합,그리고 경우에도 컴파일러를 선택할 것이 더 큰 데이터 유형에 대한 변수 식 int 를 반환합니다 당신은 같은 값을 얻으로 결과입니다.
그것의 가동에서는 식 오버플로,그것의하지 않을 때 그 결과에 할당된 변수는 오버플로우.
3)
그것은으로 변환되지 않는다.
- 이것은 오버플로입니다, 당신의 숫자는 주위를 감싸고 부정적으로 변했습니다
- 런타임의 루프가 같은 것을 유발할 수 있으므로 이것은 컴파일러의 작업이 아닙니다.
int
별칭 또는System.Int32
그것들은 .NET에서 동일합니다.
이것은 비트 표현 때문입니다
당신은 int32를 사용하지만 char (8 비트)도 마찬가지입니다.
첫 번째 비트는 부호를 보유하고 다음 비트는 숫자를 유지합니다.
7 비트로 128 숫자를 나타낼 수 있습니다 0111 1111
129 일을 시도하면 1000 0001
, 사인 비트가 설정되어 컴퓨터가 대신 -1을 생각합니다.
.NET의 산술 작업은 실제 유형을 변경하지 않습니다.
당신은 (32 비트) 정수로 시작하고 +3은 그것을 바꾸지 않을 것입니다.
그렇기 때문에이 작업을 수행 할 때 예상치 못한 라운드 번호를 얻는 이유입니다.
int a = 2147483647;
double b = a / 4;
또는
int a = 2147483647;
var b = a / 4;
그 문제에 대한.
편집하다:
.NET은 숫자를 넘어서서 예외는 없습니다.
오버플로 예외는 과제 작업에서만 또는 Mark가 예외를 생성하도록 조건을 설정할 때 설명하는대로 발생합니다.
당신이 쉽게 우리 모두에 사용하여 육식 입니다.
모두가 알고있는 여덟 번째 메르센 prime0x7FFFFFFF
그냥 선생님'
예외를 던지기를 원한다면 쓰기
abc = checked(i+3)
대신에. 그것은 오버플로를 확인합니다.
또한 C#에서 기본 설정은 오버플로에 예외를 제외하지 않는 것입니다. 그러나 프로젝트의 속성에서 해당 옵션을 전환 할 수 있습니다.