다음을 통해 공유


정수 숫자 형식(C# 참조)

정수 숫자 형식은 정수를 나타냅니다. 모든 정수 계열 숫자 형식은 값 형식입니다. 정수 계열 형식은 단순 형식 이며 리터럴을 사용하여 초기화할 수 있습니다. 모든 정수 계열 숫자 형식은 산술, 비트 논리, 비교같음 연산자를 지원합니다.

정수 계열 형식의 특징

C#은 다음과 같은 미리 정의된 정수 계열 형식을 지원합니다.

C# 형식/키워드 범위 크기 .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 ~ 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 형식은 네이티브 크기의 정수입니다. nintnuint 컨텍스트 키워드를 사용하여 네이티브 크기 정수를 정의할 수 있습니다. 네이티브 크기의 정수는 32비트 프로세스에서 실행할 때 32비트 정수이거나, 64비트 프로세스에서 실행되는 경우 64비트 정수입니다. interop 시나리오, 하위 수준 라이브러리에 사용할 수 있으며 정수 수학이 광범위하게 사용되는 시나리오에서 성능을 최적화할 수 있습니다.

네이티브 크기의 정수 형식은 내부적으로 .NET 형식 System.IntPtrSystem.UIntPtr으로 표시됩니다. 및 nuint 형식은 nint 기본 형식의 별칭입니다.

각 정수 계열 형식의 기본값은 0 0입니다.

각 정수 계열 형식에는 MinValue 해당 형식의 최소값과 MaxValue 최대값을 제공하는 속성이 있습니다. 이러한 속성은 네이티브 크기 형식(nintnuint)의 경우를 제외하고 컴파일 시간 상수입니다. MinValueMaxValue 속성은 네이티브 크기 형식에 대해 런타임 시 계산됩니다. 이러한 형식의 크기는 프로세스 설정에 따라 달라집니다.

System.Numerics.BigInteger 구조를 사용하여 상한이나 하한이 없는 부호 있는 정수를 나타냅니다.

정수 리터럴

정수 리터럴은

  • decimal: 접두사 없이
  • 16진수: 0x 또는 0X 접두사와 함께
  • 이진: 0b 또는 0B 접두사와 함께

다음 코드는 각각에 대한 예제를 보여 줍니다.

var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;

앞의 _ 예제에서는 숫자 구분 기호로 사용하는 방법을 보여 하기도 합니다. 모든 종류의 숫자 리터럴에서 숫자 구분 기호를 사용할 수 있습니다.

접미사는 다음과 같이 정수 리터럴의 형식을 결정합니다.

  • 리터럴에 접미사가 없는 경우 해당 형식은 해당 값을 나타낼 intuintlongulong수 있는 다음 형식 중 첫 번째 형식입니다.

    비고

    리터럴은 양수 값으로 해석됩니다. 예를 들어 리터럴 0xFF_FF_FF_FF4294967295 형식의 수 uint를 나타내지만, 비트 표현은 -1 형식의 수 int와 동일합니다. 특정 데이터 형식의 값이 필요한 경우, 리터럴을 해당 데이터 형식으로 형 변환하세요. 대상 형식에서 unchecked 리터럴 값을 나타낼 수 없는 경우 연산자를 사용합니다. 예를 들어 unchecked((int)0xFF_FF_FF_FF)-1을 생성합니다.

  • 리터럴에 Uu 미사가 포함된 경우 해당 형식은 해당 값을 나타낼 uintulong수 있는 다음 형식 중 첫 번째 형식입니다.

  • 리터럴에 Ll 미사가 포함된 경우 해당 형식은 해당 값을 나타낼 longulong수 있는 다음 형식 중 첫 번째 형식입니다.

    비고

    소문 l 자를 접미사로 사용할 수 있습니다. 그러나 l 문자 l 가 숫자 1와 혼동될 수 있으므로 컴파일러 경고를 생성합니다. 명확성을 위해 사용합니다 L .

  • 리터럴에 , , Ul, uL, ul, LUlULu, 또는 lu 접미사 중 UL하나가 포함된 경우 해당 형식은 다음과 같습니다.ulong

정수 리터럴로 표시되는 값이 초과 UInt64.MaxValue되면 컴파일러 오류 CS1021 이 발생합니다.

정수 리터럴의 결정된 형식이고 int 리터럴이 나타내는 값이 대상 형식의 범위 내에 있는 경우 값은 암시적으로 sbyte, , byteshort, ulonguintushortnint또는 :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.SizeUIntPtr.Size 속성에서 해당 값을 가져올 수도 있습니다.

  • 런타임에 네이티브 크기 정수의 최소값과 최대값을 가져오려면 다음 예제와 같이 MinValueMaxValuenintnuint 키워드와 함께 정적 속성으로 사용하세요.

    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 는 더 클 수 있지만 nuint 컴파일 시간 상수는 32비트 범위로 제한됩니다.

  • 컴파일러는 다른 숫자 형식으로의 암시적 및 명시적 변환을 제공합니다. 자세한 내용은 기본 제공 숫자 변환을 참조하세요.

  • 네이티브 크기에 맞는 정수 리터럴에 대한 직접적인 구문은 없습니다. 리터럴이 네이티브 크기의 정수임을 나타내는 접미사는 없습니다.(예:Llong 대신 다른 정수 값의 암시적 또는 명시적 캐스트를 사용할 수 있습니다. 다음은 그 예입니다.

    nint a = 42
    nint a = (nint)42;
    

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고하십시오