Integral numeric types
Peponi │ 11/11/2024 │ 6m
Integral numeric types
Peponi
1. Introduction
모든 정수 형식은 값 형식이며, 타입에 따라 음수를 가질 수 있다.
- 음수를 허용하지 않는 타입의 경우 키워드에
u
가 붙는다. (byte 제외)
모든 정수 형식은 산술
, 등호
, 비트
, 비교
연산을 지원하고, 기본값으로 0
을 가진다.
2. 정수 형식
C# 키워드 | .NET 형식 | 값 범위 | 크기 (bit) | 비고 |
---|---|---|---|---|
sbyte | System.SByte | -128 ~ 127 | 8 | |
byte | System.Byte | 0 ~ 255 | 8 | |
short | System.Int16 | -32,768 ~ 32,767 | 16 | |
ushort | System.UInt16 | 0 ~ 65,535 | 16 | |
int | System.Int32 | -2,147,483,648 ~ 2,147,483,647 | 32 | 특별히 큰 값이 아니라면, 정수 리터럴 초기화 시 기본값 |
uint | System.UInt32 | 0 ~ 4,294,967,295 | 32 | |
long | System.Int64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 64 | |
ulong | System.UInt64 | 0 ~ 18,446,744,073,709,551,615 | 64 | |
nint | System.IntPtr | 플랫폼 종속 프로세스 실행 환경에 따라 정해짐 | 32 or 64 | Native sized 정수 C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능 |
nuint | System.UIntPtr | 플랫폼 종속 프로세스 실행 환경에 따라 정해짐 | 32 or 64 | Native sized 정수 C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능 |
Native sized 정수는 런타임에 값이 할당되며, C# 11 (.NET7) 부터 .NET 형식의 별칭으로 지원된다. 반면, Native sized 정수를 제외한 모든 정수 형식 키워드는 .NET 형식의 별칭으로 서로 바꿔 사용 가능하고 MinValue
, MaxValue
프로퍼티가 컴파일 타임 상수로 제공된다.
int a = 1;
System.Int32 b = 1;
2.1. System.Numerics.BigInteger
long을 넘어서는 큰 수를 다뤄야 하는 경우를 위해 C#에서는 System.Numerics.BigInteger 구조체를 지원한다. System.Numerics.BigInteger
의 값 범위는 -∞ ~ ∞
이다.
3. 정수 초기화
정수 초기화 시 _
를 이용하여 자리를 구분할 수 있으며, 3가지 진법을 이용할 수 있다.
- 2진법 :
0B
또는0b
를 접두사로 붙여준다. - 10진법 : 정수 삽입
- 16진법 :
0X
또는0x
를 접두사로 붙여준다.
int binaryInt = 0b_0110_0100;
int binaryInt2 = 0b01100100;
int decimalInt = 100;
int hexInt = 0x64;
WARNING
정수 값이 ulong.MaxValue
를 초과하는 경우 컴파일 오류가 발생한다. (CS1021)
리터럴을 이용한 초기화 시에는 값 크기 및 접미사에 따라 형식이 결정된다.
-
리터럴에 접미사가 없는 경우 값 크기에 따라
int
,uint
,long
,ulong
형식 중 앞의 것으로 결정var int1 = 9_999; // int var int2 = 2_999_999_999; // uint var int3 = 9_999_999_999; // long var int4 = 9_999_999_999_999_999_999; // ulong
-
리터럴에 접미사가
U
또는u
가 붙는 경우, 값 크기에 따라uint
,ulong
형식 중 앞의 것으로 결정 -
리터럴에 접미사가
L
또는l
이 붙는 경우, 값 크기에 따라long
,ulong
형식 중 앞의 것으로 결정l
의 경우 숫자1
과 구분이 쉽지 않을 수 있어L
을 사용하는 것이 좋다.
-
리터럴에 접미사
u
(U
)와l
(L
)이 모두 붙는 경우ulong
으로 결정
리터럴 형식이 int
이고 대상 형식의 값 범위 안에 있는 경우, 암시적으로 대상 형식으로 변환된다.
-
대상 형식의 값 범위에서 벗어나는 경우 컴파일 오류가 발생한다. (CS0031)
short short1 = 30000; short short2 = 99999; // CS0031: '99999' 상수 값을 'short`(으)로 변환할 수 없습니다.
리터럴 형식은 명시적으로 다른 형식으로 변환하는 것 또한 가능하다.
var byte1 = (byte)15;
var long1 = (uint)15;
4. 정수 형식 변환 (캐스팅)
모든 정수 형식은 다른 형식으로 변환할 수 있다. 대상 형식이 입력 형식의 값을 저장할 수 있는 경우 암시적으로 변환된다. 저장할 수 없는 경우에는 명시적으로 변환을 수행한다. 이 때, 캐스트 식을 사용한다.