정수 숫자 형식(C# 참조)
정수 숫자 형식은 정수를 표현합니다. 모든 정수 숫자 형식은 값 형식입니다. 또한 단순 형식이며 리터럴로 초기화할 수 있습니다. 모든 정수 숫자 형식은 산술, 비트 논리, 비교 및 같음 연산자를 지원합니다.
정수 형식의 특성
C#은 다음과 같은 미리 정의된 정수 형식을 지원합니다.
C# 형식/키워드 | 범위 | Size | .NET 형식 |
---|---|---|---|
sbyte |
-128 ~ 127 | 부호 있는 8비트 정수 | System.SByte |
byte |
0 ~ 255 | 부호 없는 8비트 정수 | System.Byte |
short |
-32,768 ~ 32,767 | 부호 있는 16비트 정수 | System.Int16 |
ushort |
0 ~ 65,535 | 부호 없는 16비트 정수 | System.UInt16 |
int |
-2,147,483,648 ~ 2,147,483,647 | 부호 있는 32비트 정수 | System.Int32 |
uint |
0 ~ 4,294,967,295 | 부호 없는 32비트 정수 | System.UInt32 |
long |
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | 부호 있는 64비트 정수 | System.Int64 |
ulong |
0 ~ 18,446,744,073,709,551,615 | 부호 없는 64비트 정수 | System.UInt64 |
nint |
플랫폼에 따라 다름(런타임에 계산됨) | 부호 있는 32비트 또는 64비트 정수 | System.IntPtr |
nuint |
플랫폼에 따라 다름(런타임에 계산됨) | 부호 없는 32비트 또는 64비트 정수 | System.UIntPtr |
마지막 두 개를 제외한 모든 테이블 행에서 맨 왼쪽 열의 각 C# 형식 키워드는 해당하는 .NET 형식의 별칭입니다. 키워드와 .NET 형식 이름은 서로 바꿔 사용할 수 있습니다. 예를 들어 다음 선언은 동일한 형식의 변수를 선언합니다.
int a = 123;
System.Int32 b = 123;
표의 마지막 두 행에 있는 nint
및 nuint
형식은 기본 크기 정수입니다. nint
및 nuint
상황별 키워드를 사용하여 원시 크기의 정수를 정의할 수 있습니다. 이러한 정수는 32비트 프로세스에서 실행되는 경우 32비트 정수이고 64비트 프로세스에서 실행되는 경우 64비트 정수입니다. 이들은 상호 운용성 시나리오, 하위 수준 라이브러리에 사용할 수 있고 정수 연산이 광범위하게 사용되는 시나리오에서 성능을 최적화하는 데 사용할 수 있습니다.
기본 크기 정수 형식은 내부적으로 .NET 형식 System.IntPtr 및 System.UIntPtr로 표시됩니다. C# 11부터 nint
및 nuint
형식은 기본 형식의 별칭입니다.
각 정수 형식의 기본값은 0
입니다.
각 정수 형식에는 해당 형식의 최솟값과 최댓값을 제공하는 MinValue
및 MaxValue
속성이 있습니다. 이러한 속성은 원시 크기 형식(nint
및 nuint
)의 경우를 제외하고 컴파일 시간 상수입니다. MinValue
및 MaxValue
속성은 런타임에 원시 크기 형식에 대해 계산됩니다. 이러한 형식의 크기는 프로세스 설정에 따라 달라집니다.
System.Numerics.BigInteger 구조체를 사용하여 상한 또는 하한이 없는 부호 있는 정수를 나타냅니다.
정수 리터럴
정수 리터럴은 다음 형식일 수 있습니다.
- 10진: 접두사가 없음
- 16진수:
0x
또는0X
접두사 사용 - 이진:
0b
또는0B
접두사 포함
다음 코드에서는 각 예제를 보여 줍니다.
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
앞의 예제에서는 _
를 숫자 구분 기호로 사용하는 예를 보여줍니다. 모든 종류의 숫자 리터럴에서 숫자 구분 기호를 사용할 수 있습니다.
정수 리터럴의 형식은 접미사로 다음과 같이 결정됩니다.
리터럴에 접미사가 없는 경우 해당 형식은 값이 표현될 수 있는
int
,uint
,long
,ulong
형식 중 첫 번째 형식입니다.참고 항목
리터럴은 양수 값으로 해석됩니다. 예를 들어 리터럴
0xFF_FF_FF_FF
는uint
형식의 숫자4294967295
를 나타내지만,int
형식의 숫자-1
과 같은 비트를 표현합니다. 특정 형식의 값이 필요한 경우 리터럴을 해당 형식으로 캐스팅합니다. 리터럴 값을 대상 유형으로 표현할 수 없는 경우unchecked
연산자를 사용합니다. 예를 들어unchecked((int)0xFF_FF_FF_FF)
는-1
을 생성합니다.리터럴에 접미사가
U
또는u
인 경우 해당 형식은 값이 표현될 수 있는uint
,ulong
형식 중 첫 번째 형식입니다.리터럴에 접미사가
L
또는l
인 경우 해당 형식은 값이 표현될 수 있는long
,ulong
형식 중 첫 번째 형식입니다.참고 항목
소문자
l
를 접미사로 사용할 수 있습니다. 그러나 이렇게 하면 문자l
및 숫자1
을 혼동하기 쉬우므로 컴파일러 경고가 생성됩니다. 쉽게 구별할 수 있도록L
을 사용합니다.리터럴의 접미사가
UL
,Ul
,uL
,ul
,LU
,Lu
,lU
또는lu
이면 해당 형식은ulong
입니다.
정수 리터럴로 표시되는 값이 UInt64.MaxValue를 초과하면 컴파일 오류 CS1021이 발생합니다.
결정된 정수 리터럴 형식이 int
이고 리터럴이 나타내는 값이 대상 형식의 범위 내에 있는 경우, 해당 값이 암시적으로 sbyte
, byte
, short
, ushort
, uint
, ulong
, nint
또는 nuint
으로 변환될 수 있습니다.
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
앞의 예제에서 볼 수 있듯이 리터럴의 값이 대상 형식의 범위 내에 있지 않으면 컴파일러 오류 CS0031이 발생합니다.
캐스트를 사용하여 정수 리터럴로 표시되는 값을 결정된 리터럴 형식 이외의 형식으로 변환할 수도 있습니다.
var signedByte = (sbyte)42;
var longVariable = (long)42;
변환
모든 정수 숫자 형식을 다른 정수 숫자 형식으로 변환할 수 있습니다. 대상 형식이 소스 형식의 모든 값을 저장할 수 있는 경우 변환은 암시적입니다. 저장할 수 없는 경우에는 캐스트 식를 사용하여 명시적 변환을 수행해야 합니다. 자세한 내용은 기본 제공 숫자 변환을 참조하세요.
원시 크기 정수
스토리지는 대상 컴퓨터의 자연 정수 크기에 따라 결정되므로 원시 크기의 정수 형식은 특별한 동작을 갖습니다.
런타임에 기본 크기 정수의 크기를 가져오려면
sizeof()
를 사용할 수 있습니다. 그러나 안전하지 않은 컨텍스트에서는 코드를 컴파일해야 합니다. 예시:Console.WriteLine($"size of nint = {sizeof(nint)}"); Console.WriteLine($"size of nuint = {sizeof(nuint)}"); // output when run in a 64-bit process //size of nint = 8 //size of nuint = 8 // output when run in a 32-bit process //size of nint = 4 //size of nuint = 4
정적 IntPtr.Size 및 UIntPtr.Size 속성에서 동등한 값을 가져올 수도 있습니다.
런타임에 기본 크기 정수의 최소값 및 최대값을 가져오려면 다음 예제와 같이
MinValue
및MaxValue
를nint
및nuint
키워드를 포함하는 정적 속성으로 사용합니다.Console.WriteLine($"nint.MinValue = {nint.MinValue}"); Console.WriteLine($"nint.MaxValue = {nint.MaxValue}"); Console.WriteLine($"nuint.MinValue = {nuint.MinValue}"); Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}"); // output when run in a 64-bit process //nint.MinValue = -9223372036854775808 //nint.MaxValue = 9223372036854775807 //nuint.MinValue = 0 //nuint.MaxValue = 18446744073709551615 // output when run in a 32-bit process //nint.MinValue = -2147483648 //nint.MaxValue = 2147483647 //nuint.MinValue = 0 //nuint.MaxValue = 4294967295
다음 범위에서 상수 값을 사용할 수 있습니다.
nint
: Int32.MinValue~Int32.MaxValue.nuint
: UInt32.MinValue~UInt32.MaxValue.
컴파일러는 다른 숫자 형식으로 암시적 변환과 명시적 변환을 제공합니다. 자세한 내용은 기본 제공 숫자 변환을 참조하세요.
기본 크기 정수 리터럴에 대한 직접 구문은 없습니다.
L
이long
을 나타내는 것과 같이 리터럴이 기본 크기 정수임을 나타내는 접미사는 없습니다. 대신 다른 정수 값의 암시적 또는 명시적 캐스트를 사용할 수 있습니다. 예시:nint a = 42 nint a = (nint)42;
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET