-1이 출력되는 것은 맞습니다.
long 형식의 최댓값인 long.MaxValue는 9223372036854775807이며, int 형식의 범위는 -2147483648에서 2147483647입니다. 따라서 long 형식의 최댓값을 int로 변환하려고 하면 오버플로우(overflow)가 발생하여 예상치 못한 결과가 나타납니다.
질문의 코드에서, long을 int로 명시적으로 변환하면서 생기는 오버플로우 문제로 인해 -1이 출력되는 것입니다.
.NET에서 숫자 형식의 변환은 비트 레벨에서 이루어집니다. long.MaxValue는 비트에서 모든 위치가 1로 설정된 상태를 의미합니다. 그런데 int로 변환하면서 상위 32비트는 모두 잘려나가고 남는 하위 32비트는 모두 1로 설정되어 있습니다. 이는 2의 보수 표기법으로 표현된 int형의 -1을 의미합니다.
따라서, 이 코드가 오류를 발생시키지는 않지만, 아마도 의도하지 않은 결과를 초래할 것입니다. 이러한 오버플로우 문제를 피하기 위해, 가능하면 형식 변환을 할 때는 변환될 데이터의 범위가 변환할 형식의 범위 내에 있는지 먼저 확인하는 것이 좋습니다.
On 2023-05-30 오후 1:55:00, '김태원' wrote:
using System;
class TypeConversionError
{
static void Main()
{
long l = long.MaxValue; //[1] long 형식 변수의 가장 큰 값을 l 변수에 저장
Console.WriteLine($"l의 값: {l}");
int i = (int)l; //[2] l 변수의 값을 int 형식으로 형식 변환하여 i 변수에 저장
Console.WriteLine($"i의 값: {i}");
}
}에서
int i = (int)l;
Console.WriteLine($"i의 값: {i}");
부분을 잘 이해가 안가네요
왜 -1이 되는지 모르겠어요
-1이 되는게 틀린거아닌가요?
-1이 출력되는게 맞는답인가요? 틀린답인가요?