다음을 통해 공유


about_Numeric_Literals

간단한 설명

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

자세한 설명

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

정수 리터럴

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

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

접미사 의미 참고 항목
y 서명된 바이트 데이터 형식 PowerShell 6.2에 추가됨
uy 부호 없는 바이트 데이터 형식 PowerShell 6.2에 추가됨
s short 데이터 형식 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 테리바이트 (1024 4) 승수
pb petibyte (10245) 승수

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

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

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

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

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

real 리터럴

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

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

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

접미사 의미
d 10진수 데이터 형식
kb kibibyte (10241) 승수
mb mebibyte (10242) 승수
gb gigibyte (10243) 승수
tb 테리바이트 (1024 4) 승수
pb petibyte (10245) 승수

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

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

참고 항목

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

숫자 승수

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

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

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

예제

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

number Type
100 Int32 100
100u UInt32 100
100D 소수 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy Byte 100
100y SByte 100
1e2 Double 100
1.e2 Double 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진수 사용

접미사가 지정된 경우에만 n 지나치게 큰 이진 또는 16진수 리터럴은 구문 분석 실패 대신 반환 [bigint] 할 수 있습니다. 그러나 기호 비트는 여전히 짝수 [decimal] 범위 이상으로 유지됩니다.

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

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

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

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

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

큰 값 리터럴 구문 분석

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

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

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

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

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

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

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