문제

        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)
그것은으로 변환되지 않는다.

  1. 이것은 오버플로입니다, 당신의 숫자는 주위를 감싸고 부정적으로 변했습니다
  2. 런타임의 루프가 같은 것을 유발할 수 있으므로 이것은 컴파일러의 작업이 아닙니다.
  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#에서 기본 설정은 오버플로에 예외를 제외하지 않는 것입니다. 그러나 프로젝트의 속성에서 해당 옵션을 전환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top