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은 다음 형식 가속기를 지원합니다.
참고 항목
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]
구문 분석합니다.
정수 숫자 리터럴 구문 분석
정수 형식 리터럴은 다음 단계를 사용하여 구문 분석됩니다.
- radix 형식 확인
- 이진 형식의 경우 .로
[BigInteger]
구문 분석합니다. - 16진수 형식의 경우 값
[int]
이[BigInteger]
또는[long]
범위에 있을 때 원래 동작을 유지하기 위해 특수 사례를 사용하여 구문 분석합니다. - 이진 또는 16진수 모두 없는 경우 일반적으로 .로
[BigInteger]
구문 분석합니다.
- 이진 형식의 경우 .로
- 오버플로 없이 형식 범위를 적절하게 검사할 수 있도록 캐스트를 시도하기 전에 승수 값을 적용합니다.
- 형식 접미사를 확인합니다.
- 형식 범위를 확인하고 해당 형식으로 구문 분석하려고 시도합니다.
- 접미사가 사용되지 않는 경우 값은 다음 순서로 경계를 검사하여 첫 번째 테스트에 성공하여 숫자의 형식을 결정합니다.
[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]
구문 분석됩니다.
PowerShell