Favicon

Integral numeric types

Peponi11/11/20246m

C#
SyntaxTypeNumeric

1. Introduction

모든 정수 형식은 값 형식이며, 타입에 따라 음수를 가질 수 있다.

  • 음수를 허용하지 않는 타입의 경우 키워드에 u가 붙는다. (byte 제외)

모든 정수 형식은 산술, 등호, 비트, 비교 연산을 지원하고, 기본값으로 0을 가진다.

2. 정수 형식

C# 키워드.NET 형식값 범위크기 (bit)비고
sbyteSystem.SByte-128 ~ 1278
byteSystem.Byte0 ~ 2558
shortSystem.Int16-32,768 ~ 32,76716
ushortSystem.UInt160 ~ 65,53516
intSystem.Int32-2,147,483,648 ~ 2,147,483,64732특별히 큰 값이 아니라면, 정수 리터럴 초기화 시 기본값
uintSystem.UInt320 ~ 4,294,967,29532
longSystem.Int64-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,80764
ulongSystem.UInt640 ~ 18,446,744,073,709,551,61564
nintSystem.IntPtr플랫폼 종속
프로세스 실행 환경에 따라 정해짐
32 or 64Native sized 정수
C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능
nuintSystem.UIntPtr플랫폼 종속
프로세스 실행 환경에 따라 정해짐
32 or 64Native sized 정수
C# 키워드는 C# 9.0 (.NET5) 이상 사용 가능

Native sized 정수는 런타임에 값이 할당되며, C# 11 (.NET7) 부터 .NET 형식의 별칭으로 지원된다. 반면, Native sized 정수를 제외한 모든 정수 형식 키워드는 .NET 형식의 별칭으로 서로 바꿔 사용 가능하고 MinValue, MaxValue 프로퍼티가 컴파일 타임 상수로 제공된다.

Native sized 정수를 제외한 정수 형식
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. 정수 형식 변환 (캐스팅)

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

5. 참조 자료