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. 정수 형식 변환 (캐스팅)
모든 정수 형식은 다른 형식으로 변환할 수 있다. 대상 형식이 입력 형식의 값을 저장할 수 있는 경우 암시적으로 변환된다. 저장할 수 없는 경우에는 명시적으로 변환을 수행한다. 이 때, 캐스트 식을 사용한다.