다음을 통해 공유


about_Numeric_Literals

간단한 설명

이 문서에서는 PowerShell에서 숫자 값의 구문 및 사용에 대해 설명합니다.

긴 설명

숫자 리터럴에는 정수와 실수의 두 종류가 있습니다. 둘 다 형식 및 승수 접미사를 가질 수 있습니다.

정수 리터럴

정수 리터럴은 10진수, 16진수 또는 이진 표기법으로 작성할 수 있습니다. 16진수 리터럴에는 0x 접두사로 지정되고 이진 리터럴에는 10진수와 구분하기 위해 0b 접두사로 지정됩니다.

정수 리터럴에는 형식 접미사와 승수 접미사가 있을 수 있습니다.

접미사 의미 메모
y 서명된 바이트 데이터 형식 PowerShell 6.2에 추가됨
uy 부호 없는 바이트 데이터 형식 PowerShell 6.2에 추가됨
s 짧은 데이터 형식 PowerShell 6.2에 추가됨
us 서명되지 않은 짧은 데이터 형식 PowerShell 6.2에 추가됨
l long 데이터 형식
u unsigned int 또는 long 데이터 형식 PowerShell 6.2에 추가됨
ul 서명되지 않은 긴 데이터 형식 PowerShell 6.2에 추가됨
n BigInteger 데이터 형식 PowerShell 7.0에 추가됨
kb kibibyte (10241) 승수
mb mebibyte (10242) 승수
gb gigibyte(10243) 승수
tb teribyte (10244) 승수
pb petibyte (10245) 승수

정수 리터럴의 형식은 해당 값, 형식 접미사 및 숫자 승수 접미사에 의해 결정됩니다.

형식 접미사가 없는 정수 리터럴의 경우:

  • [int]형식으로 값을 나타낼 수 있는 경우 해당 형식입니다.
  • 그렇지 않으면 [long]형식으로 값을 나타낼 수 있는 경우 해당 형식입니다.
  • 그렇지 않으면 [decimal]형식으로 값을 나타낼 수 있는 경우 해당 형식입니다.
  • 그렇지 않으면 [double]형식으로 표시됩니다.

형식 접미사가 있는 정수 리터럴의 경우:

  • 형식 접미사가 u 값이 [uint] 형식으로 표시될 수 있으면 해당 형식은 [uint].
  • 형식 접미사가 u 값이 [ulong] 형식으로 표시될 수 있으면 해당 형식은 [ulong].
  • 해당 값을 지정된 형식으로 나타낼 수 있으면 해당 형식입니다.
  • 그렇지 않으면 해당 리터럴의 형식이 잘못되었습니다.

실제 리터럴

실제 리터럴은 10진수 표기법으로만 작성할 수 있습니다. 이 표기법은 지수 부분을 사용하는 소수점 및 과학적 표기법을 따르는 소수 값을 포함할 수 있습니다.

지수 부분에는 'e'와 선택적 기호(+/-) 및 지수를 나타내는 숫자가 포함됩니다. 예를 들어 리터럴 값 1e2 숫자 값 100과 같습니다.

실제 리터럴에는 형식 접미사와 승수 접미사가 있을 수 있습니다.

접미사 의미
d 10진수 데이터 형식
kb kibibyte (10241) 승수
mb mebibyte (10242) 승수
gb gigibyte(10243) 승수
tb teribyte (10244) 승수
pb petibyte (10245) 승수

실제 리터럴에는 이중 및 소수점이라는 두 가지 종류가 있습니다. 각각 소수 형식 접미사의 부재 또는 존재 여부가 표시됩니다. PowerShell은 [float] 값의 리터럴 표현을 지원하지 않습니다. double real 리터럴에는 [double]형식이 있습니다. 10진수 실제 리터럴에는 [decimal]형식이 있습니다. 소수 실제 리터럴의 분수 부분에 있는 후행 0은 중요합니다.

[double] 실제 리터럴의 지수 부분 자릿수 값이 지원되는 최소값보다 작으면 해당 [double] 실제 리터럴의 값은 0입니다. [decimal] 실제 리터럴의 지수 부분 자릿수 값이 지원되는 최소값보다 작으면 해당 리터럴의 형식이 잘못되었습니다. [double] 또는 [decimal] 실제 리터럴의 지수 부분 자릿수 값이 지원되는 최대값보다 크면 해당 리터럴의 형식이 잘못되었습니다.

메모

구문은 이중 실제 리터럴이 긴 형식 접미사를 가질 수 있도록 허용합니다. PowerShell은 이 경우 값을 [long]형식으로 나타내는 정수 리터럴로 처리합니다. 이 기능은 이전 버전의 PowerShell과의 호환성을 위해 유지되었습니다. 그러나 프로그래머는 리터럴의 실제 값을 쉽게 가릴 수 있으므로 이 형식의 정수 리터럴을 사용하지 않는 것이 좋습니다. 예를 들어 1.2L 값이 1이고, 1.2345e1L 값이 12이고, 1.2345e-5L 값이 0이며, 그 중 어느 것도 즉시 명확하지 않습니다.

숫자 승수

편의를 위해 정수 및 실제 리터럴에는 일반적으로 사용되는 2의 승수 집합 중 하나를 나타내는 숫자 승수가 포함될 수 있습니다. 숫자 승수는 대문자 또는 소문자의 조합으로 작성할 수 있습니다.

승수 접미사는 모든 형식 접미사와 함께 사용할 수 있지만 형식 접미사 후에 있어야 합니다. 예를 들어 리터럴 100gbL 형식이 잘못되었지만 리터럴 100Lgb 유효합니다.

승수가 접미사가 지정하는 숫자 형식의 가능한 값을 초과하는 값을 만들면 리터럴의 형식이 잘못되었습니다. 예를 들어 1usgb 값이 1gb 접미사로 지정된 [ushort] 형식에 허용되는 값보다 크기 때문에 리터럴 us 형식이 잘못되었습니다.

승수 예제

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

숫자 형식 가속기

PowerShell은 다음 형식 가속기를 지원합니다.

가속기 메모 묘사
[byte] 바이트(부호 없는)
[sbyte] 바이트(부호 있음)
[int16] 16비트 정수
[short] [int16] 별칭 16비트 정수
[uint16] 16비트 정수(부호 없는)
[ushort] [uint16] 별칭 16비트 정수(부호 없는)
[int32] 32비트 정수
[int] [int32] 별칭 32비트 정수
[uint32] 32비트 정수(부호 없는)
[uint] [uint32] 별칭 32비트 정수(부호 없는)
[int64] 64비트 정수
[long] [int64] 별칭 64비트 정수
[uint64] 64비트 정수(부호 없는)
[ulong] [uint64] 별칭 64비트 정수(부호 없는)
[bigint] BigInteger 구조체 참조
[single] 단정밀도 부동 소수점
[float] [single] 별칭 단정밀도 부동 소수점
[double] 배정밀도 부동 소수점
[decimal] 128비트 부동 소수점

메모

PowerShell 6.2에는 [short], [ushort], [uint], [ulong]형식 가속기가 추가되었습니다.

예시

다음 표에는 숫자 리터럴의 몇 가지 예제가 포함되어 있으며 해당 형식과 값이 나열되어 있습니다.

100 Int32 100
100u UInt32 100
100D 십진법 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy 바이트 100
100y SByte 100
1e2 100
1.e2 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D 십진법 482
482gb Int64 517543559168
482ngb BigInteger 517543559168
0x1e2lgb Int64 517543559168
0b1011011 Int32 91
0xFFFF Int16 -1
0xFFFFFFFF Int32 -1
-0xFFFFFFFF Int32 1
0xFFFFFFFFu UInt32 4294967295

이진 또는 16진수 사용

지나치게 큰 이진 또는 16진수 리터럴은 [bigint] 접미사가 지정된 경우에만 구문 분석을 실패하지 않고 n 반환할 수 있습니다. 그러나 부호 비트는 [decimal] 범위에서도 계속 적용됩니다.

  • 이진 문자열이 8비트 길이의 일부 배수인 경우 가장 높은 비트는 부호 비트로 처리됩니다.
  • 길이가 8인 16진수 문자열의 첫 번째 숫자가 8 이상인 경우 숫자는 음수로 처리됩니다.

이진 및 16진수 리터럴에 부호 없는 접미사를 지정하면 부호 비트가 무시됩니다. 예를 들어 0xFFFFFFFF-1반환하지만 0xFFFFFFFFu 4294967295 [uint]::MaxValue 반환합니다.

PowerShell 7.1에서 16진수 리터럴에 형식 접미사를 사용하면 이제 해당 형식의 서명된 값이 반환됩니다. 예를 들어 PowerShell 7.0에서는 양수 값이 너무 커서 0xFFFFs 형식에 비해 식 [int16] 오류를 반환합니다. PowerShell 7.1은 이를 -1 형식인 [int16] 해석합니다.

리터럴을 0 접두사로 지정하면 이를 우회하고 서명되지 않은 것으로 처리됩니다. 예: 0b011111111. [bigint]u 접미사를 결합할 수 없으므로 n 범위에서 리터럴로 작업할 때 필요할 수 있습니다.

- 접두사를 사용하여 이진 및 16진수 리터럴을 부정할 수도 있습니다. 이 경우 부호 비트가 허용되므로 양수가 발생할 수 있습니다.

BigInteger 접미사가 있는 숫자의 경우 기호 비트가 허용됩니다.

  • BigInteger 접미사 16진수는 길이가 8자인 모든 리터럴의 높은 비트를 부호 비트로 처리합니다. 길이에는 0x 접두사 또는 접미사가 포함되지 않습니다.
  • BigInteger 접미사가 있는 이진 파일은 96자 및 128자, 이후 8자마다 부호 비트를 허용합니다.

숫자 형식 변환

문자열이 숫자로 변환되면 추가 16진수 형식 표시기가 지원됩니다. 이러한 추가 형식은 리터럴로 인식되지 않습니다.

[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15

숫자 리터럴처럼 보이는 명령

유효한 숫자 리터럴처럼 보이는 명령은 호출 연산자(&)를 사용하여 실행해야 합니다. 그렇지 않으면 숫자로 해석됩니다. 1usgb 같은 유효한 구문이 있는 형식이 잘못된 리터럴은 다음과 같은 오류가 발생합니다.

PS> 1usgb
At line:1 char:6
+ 1usgb
+      ~
The numeric constant 1usgb is not valid.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant

그러나 1gbus 같은 잘못된 구문이 있는 잘못된 형식의 리터럴은 표준 bare 문자열로 해석되며 명령이 호출될 수 있는 컨텍스트에서 유효한 명령 이름으로 해석될 수 있습니다.

숫자 개체의 액세스 속성 및 메서드

숫자 리터럴의 멤버에 액세스하려면 리터럴을 괄호로 묶어야 하는 경우가 있습니다.

  • 리터럴에 소수점이 없습니다.
  • 리터럴에 소수점 다음의 자릿수가 없습니다.
  • 리터럴에 접미사가 없습니다.

예를 들어 다음 예제는 실패합니다.

PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+           ~
An expression was expected after '('.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression

다음 예제가 작동합니다.

PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32

PowerShell 파서가 숫자 리터럴이 끝나는 위치와 GetType 메서드가 시작되는 위치를 확인할 수 있으므로 처음 두 예제는 리터럴 값을 괄호로 묶지 않고 작동합니다.

PowerShell이 숫자 리터럴을 구문 분석하는 방법

PowerShell v7.0은 새 기능을 사용하도록 숫자 리터럴을 구문 분석하는 방식을 변경했습니다.

실제 숫자 리터럴 구문 분석

리터럴에 소수점 또는 e 표기법이 포함된 경우 리터럴 문자열은 실수로 구문 분석됩니다.

  • 10진수 접미사가 있으면 [decimal].
  • 그렇지 않으면 [double] 구문 분석하고 값에 승수를 적용합니다. 그런 다음 형식 접미사를 확인하고 적절한 형식으로 캐스팅하려고 시도합니다.
  • 문자열에 형식 접미사가 없는 경우 [double]구문 분석합니다.

정수 숫자 리터럴 구문 분석

정수 형식 리터럴은 다음 단계를 사용하여 구문 분석됩니다.

  1. radix 형식 확인
    • 이진 형식의 경우 [bigint]구문 분석합니다.
    • 16진수 형식의 경우 값이 [bigint] 또는 [int] 범위에 있을 때 원래 동작을 유지하기 위해 특수 사례를 사용하여 [long] 구문 분석합니다.
    • 이진 또는 16진수 모두 없는 경우 일반적으로 [bigint]구문 분석합니다.
  2. 오버플로 없이 형식 범위를 적절하게 검사할 수 있도록 캐스트를 시도하기 전에 승수 값을 적용합니다.
  3. 형식 접미사를 확인합니다.
    • 형식 범위를 확인하고 해당 형식으로 구문 분석하려고 시도합니다.
    • 접미사가 사용되지 않는 경우 값은 다음 순서로 경계를 검사하여 첫 번째 테스트에 성공하여 숫자의 형식을 결정합니다.
      • [int]
      • [long]
      • [decimal](base-10 리터럴만 해당)
      • [double](base-10 리터럴만 해당)
    • 값이 16진수 및 이진 번호의 [long] 범위를 벗어나면 구문 분석이 실패합니다.
    • 값이 base 10 번호의 [double] 범위를 벗어나면 구문 분석이 실패합니다.
    • 리터럴을 n구문 분석하려면 BigInteger 접미사를 사용하여 더 높은 값을 명시적으로 작성해야 합니다.

큰 값 리터럴 구문 분석

이전에는 더 높은 정수 값이 다른 형식으로 캐스팅되기 전에 double로 구문 분석되었습니다. 이렇게 하면 더 높은 범위에서 정밀도가 손실됩니다. 예를 들어:

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

이 문제를 방지하려면 값을 문자열로 작성한 다음 변환해야 했습니다.

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

PowerShell 7.0에서는 N 접미사를 사용해야 합니다.

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

또한 정확도를 유지하기 위해 소수 접미사 [ulong]::MaxValue 사용하여 [decimal]::MaxValueD 사이의 값을 표시해야 합니다. 접미사가 없으면 이러한 값은 실제 구문 분석 모드를 사용하여 [double] 구문 분석됩니다.