Introduction
- 모든 정수 형식은 값 형식이다.
- 타입에 따라 음수를 가질 수 있다.
- 음수를 허용하지 않는 타입의 경우 키워드에
u
가 붙는다. (byte 제외)
- 음수를 허용하지 않는 타입의 경우 키워드에
- 모든 정수 형식은
산술
,등호
,비트
,비교
연산을 지원한다. - 모든 정수 형식의 기본값은
0
이다.
정수 형식
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 정수. System.IntPtr 형태를 더 많이 사용 C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능 |
nuint | System.UIntPtr | 플랫폼 종속 프로세스 실행 환경에 따라 정해짐 |
32 or 64 | Native sized 정수 C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능 |
- Native sized 정수를 제외한 모든 정수 형식에는
MinValue
,MaxValue
프로퍼티가 컴파일 타임 상수로 제공된다.- Native sized 정수는 런타임에 값이 할당된다.
- Native sized 정수를 제외한 모든 정수 형식 키워드는 .NET 형식의 별칭으로, 서로 바꿔 사용 가능하다.
int a = 1; System.Int32 b = 1;
- Native sized 정수는 C# 11 (.NET7) 부터 .NET 형식의 별칭으로 지원된다.
System.Numerics.BigInteger
- long을 넘어서는 큰 수를 다뤄야 하는 경우를 위해 C#에서는 System.Numerics.BigInteger 구조체를 지원한다.
System.Numerics.BigInteger
의 값 범위는-∞ ~ ∞
이다.
정수 초기화
정수 초기화 시
_
를 이용하여 자리를 구분할 수 있으며, 3가지 진법을 이용할 수 있다.2진법 :
0B
또는0b
를 접두사로 붙여준다.10진법 : 정수 삽입
16진법 :
0X
또는0x
를 접두사로 붙여준다.// 정수 100을 초기화 int binaryInt = 0b_0110_0100; int binaryInt2 = 0b01100100; int decimalInt = 100; int hexInt = 0x64;
정수 값이
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
와L
이 모두 붙는 경우ulong
으로 결정- 대소문자 상관 없음
- 대소문자 상관 없음
- 리터럴에 접미사가 없는 경우 값 크기에 따라
리터럴 형식이
int
이고 대상 형식의 값 범위 안에 있는 경우, 암시적으로 대상 형식으로 변환된다.- 대상 형식의 값 범위에서 벗어나는 경우 컴파일 오류가 발생한다. (CS0031)
short short1 = 30000; short short2 = 99999; // CS0031: '99999' 상수 값을 'short`(으)로 변환할 수 없습니다.
- 대상 형식의 값 범위에서 벗어나는 경우 컴파일 오류가 발생한다. (CS0031)
리터럴 형식을 명시적으로 다른 형식으로 변환하는 것 또한 가능하다.
var byte1 = (byte)15; var long1 = (uint)15;
정수 형식 변환 (캐스팅)
- 모든 정수 형식은 다른 형식으로 변환 가능하다.
- 대상 형식이 입력 형식의 값을 저장할 수 있는 경우 암시적으로 변환된다.
- 저장할 수 없는 경우 명시적으로 변환을 수행한다. 이 때, 캐스트 식을 사용한다.