C#에서이 특정 작업 오퍼가 오버 플로우 (참조 CS0220) 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/713271

문제

바이트에 저장된 니블 정보가있는 큰 INT64를 구성하려고합니다.

다음 줄의 코드 라인은 예상대로 작동합니다.

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000));

다음 줄이 컴파일 오류 CS0220으로 이어지는 이유는 "점검 모드에서 컴파일 시간에서 작동이 오버 플로우"되는 이유는 무엇입니까?

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000));

결과는 다음과 같습니다.

FFFFFFFFD0000000

대신에:

0000D0000000

누구든지 이것을 설명 할 수 있습니까? 나는 이제 Shift 연산자로 변환 할 것이지만, 왜이 접근법이 작동하지 않는지 궁금합니다!

업데이트 : (int64) (0x0d << 28)를 사용할 때도 오류가 발생합니다.

도움이 되었습니까?

해결책

구체적으로 일정한 값을 Long (int64s) 또는 Ulongs (UINT64S)로 표시해야하며, 그렇지 않으면 기본적으로 기본적으로 INTS (IE Int32S)로 통역사가되어 명확하게 오버플로가 발생합니다. 곱셈 작업 후 캐스팅은이 경우에도 좋지 않습니다.

테스트하지 않았지만이 코드는 작동해야합니다.

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);

다른 팁

정수 리터럴에는 유형 int32가 있습니다 (16 진수에서도). "l"접미사를 사용하여 길게 만듭니다 (int64).

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);

먼저 나는 그것이 int32로 곱셈을하고 있고 넘쳐나고 있다고 생각합니다. 개별 피연산자를 Int64에 캐스트 한 다음 곱해야합니다. 지금은 결과 만 캐스팅하고 있습니다.

즉, 나는 그것이 왜 그 한 줄에서만 문제를 찾을 수 있는지 모르겠지만 더 큰 숫자를 가진 첫 번째 줄은 아닙니다.

nd

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