C# 숫자 승격(Numeric Promotion)이란?
숫자 승격(Numeric Promotion)은 이름 그대로 크기가 작은 데이터 형식이 산술 연산 과정에서 자동으로 더 큰 데이터 형식으로 변환되는 것을 의미합니다. 대표적인 예로 short 형식이 int 형식으로 승격되는 경우를 들 수 있습니다.
C#에서는 연산의 정확성과 오버플로우 방지를 위해, 산술 연산자를 사용할 때 컴파일러가 자동으로 이러한 형식 승격을 수행합니다. 즉, 개발자가 명시적으로 형변환 코드를 작성하지 않아도 내부적으로 안전한 타입으로 변환되어 연산이 처리됩니다.
곱셈 연산자에서의 숫자 승격 예제
아래 예제는 곱셈(Arithmetic Operator multiply) 연산에서 일어나는 숫자 승격을 보여줍니다. short와 ushort 두 변수를 곱하면, 두 값 모두 자동으로 더 큰 형식인 int로 승격된 후 연산이 수행됩니다.
코드
using System;
class Program {
static void Main() {
short val1 = 99;
ushort val2 = 11;
// short와 ushort가 자동으로 int로 승격되어 곱셈됨
int res = val1 * val2;
Console.WriteLine(res);
}
}실행 결과
1089
동작 원리 설명
위 코드에서 val1(short)과 val2(ushort)는 서로 다른 부호 여부를 가진 16비트 정수 형식입니다. C# 명세에 따르면, * 연산자는 기본적으로 int 이상의 크기에서 동작하도록 정의되어 있기 때문에, 두 피연산자는 곱셈이 이루어지기 전에 각각 int 형식으로 암시적 승격(implicit promotion)됩니다.
그 결과 연산 결과값도 int 형식이 되며, 별도의 명시적 캐스팅 없이 int res 변수에 바로 대입할 수 있습니다. 만약 승격이 일어나지 않았다면 16비트 범위를 넘는 결과에서 오버플로우가 발생할 위험이 있지만, 자동 승격 덕분에 연산이 훨씬 안전하게 처리됩니다.
정리
C#의 숫자 승격은 작은 정수 형식(byte, sbyte, short, ushort, char 등)이 산술 연산 시 자동으로 int 이상의 형식으로 변환되는 메커니즘입니다. 이를 통해 개발자는 형변환을 신경 쓰지 않고도 안전하고 일관된 산술 연산을 수행할 수 있습니다.