C#에서이 특정 작업 오퍼가 오버 플로우 (참조 CS0220) 이유는 무엇입니까?
-
23-08-2019 - |
문제
바이트에 저장된 니블 정보가있는 큰 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
제휴하지 않습니다 StackOverflow