Share via


about_Arithmetic_Operators

간단한 설명

PowerShell에서 산술 연산을 수행하는 연산자를 설명합니다.

자세한 설명

산술 연산자는 숫자 값을 계산합니다. 하나 이상의 산술 연산자를 사용하여 값을 추가하고, 빼고, 곱하고, 나누고, 나누기 연산의 re기본der(모듈러스)를 계산할 수 있습니다.

더하기 연산자(+) 및 곱하기 연산자()도* 문자열, 배열 및 해시 테이블에서 작동합니다. 더하기 연산자는 입력을 연결합니다. 곱하기 연산자는 입력의 여러 복사본을 반환합니다. 산술 문에서 개체 형식을 혼합할 수도 있습니다. 문을 평가하는 데 사용되는 메서드는 식에서 가장 왼쪽 개체의 형식에 따라 결정됩니다.

PowerShell 2.0부터 모든 산술 연산자는 64비트 숫자에서 작동합니다.

PowerShell 3.0 -shr 부터 PowerShell에서 비트 산술 연산을 지원하기 위해 (shift-right) 및 -shl (shift-left)가 추가됩니다. 비트 연산자는 정수 형식에서만 작동합니다.

PowerShell은 다음과 같은 산술 연산자를 지원합니다.

  • 더하기(+) - 숫자를 추가하고 문자열, 배열 및 해시 테이블을 연결합니다.

    6 + 2                        # result = 8
    "file" + "name"              # result = "filename"
    @(1, "one") + @(2.0, "two")  # result = @(1, "one", 2.0, "two")
    @{"one" = 1} + @{"two" = 2}  # result = @{"one" = 1; "two" = 2}
    
  • 빼기(-) - 숫자를 빼거나 부정합니다.

    6 - 2   # result = 4
    - -6    # result = 6
    (Get-Date).AddDays(-1) # Yesterday's date
    
  • 곱하기(*) - 지정된 횟수만큼 숫자를 곱하거나 문자열 및 배열을 복사합니다.

    6 * 2       # result = 12
    @("!") * 4  # result = @("!","!","!","!")
    "!" * 3     # result = "!!!"
    
  • 나누기(/) - 숫자 나누기

    6 / 2  # result = 3
    
  • 모듈러스(%) - 나누기 연산의 re기본der를 반환합니다.

    7 % 2  # result = 1
    
  • 비트 AND(-band)

    5 -band 3  # result = 1
    
  • 비트 NOT(-bnot)

    -bnot 5  # result = -6
    
  • 비트 OR(-bor)

    5 -bor 0x03  # result = 7
    
  • 비트 XOR(-bxor)

    5 -bxor 3   # result = 6
    
  • 비트를 왼쪽으로 이동(-shl)

    102 -shl 2  # result = 408
    
  • 비트를 오른쪽으로 이동(-shr)

    102 -shr 2  # result = 25
    

연산자 우선 순위

PowerShell은 다음과 같은 순서로 산술 연산자를 처리합니다.

우선 순위 Operator 설명
1 () 괄호
2 - 음수 또는 단항 연산자
3 *, , /% 곱하기 및 나누기
4 +, - 추가 및 빼기
5 -band, -bnot 비트 연산의 경우
5 -bor, -bxor 비트 연산의 경우
5 -shr, -shl 비트 연산의 경우

PowerShell은 선행 규칙에 따라 왼쪽에서 오른쪽으로 식을 처리합니다. 다음 예제에서는 우선 순위 규칙의 효과를 보여 줍니다.

3+6/3*4    # result = 11
3+6/(3*4)  # result = 3.5
(3+6)/3*4  # result = 12

PowerShell에서 식을 평가하는 순서는 사용한 다른 프로그래밍 및 스크립팅 언어와 다를 수 있습니다. 다음 예제에서는 복잡한 대입 문을 보여 있습니다.

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$b[$a] = $c[$a++]

이 예제에서 식 $a++ 은 앞에 $b[$a]계산됩니다. 계산하면 $a++$c[$a++]에 사용된 후의 값이 변경되지만 이 값이 사용되기 전의 값 $a 이 변경됩니다$b[$a]. 변수 $a$b[$a] 는 같지 않고 0같음입니다1. 따라서 문은 값이 아닌 $b[0]값을 $b[1]할당합니다.

위의 코드는 다음과 같습니다.

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp

나누기 및 반올림

나누기 작업의 몫이 정수이면 PowerShell은 값을 가장 가까운 정수로 반올림합니다. 값이면 .5가장 가까운 짝수 정수로 반올림됩니다.

다음 예제에서는 가장 가까운 짝수로 반올림하는 효과를 보여 있습니다.

PS> [int]( 5 / 2 )  # Result is rounded down
2

PS> [int]( 7 / 2 )  # Result is rounded up
4

클래스를 [Math] 사용하여 다른 반올림 동작을 가져올 수 있습니다.

PS> [int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero)
3

PS> [int][Math]::Ceiling(5 / 2)
3

PS> [int][Math]::Floor(5 / 2)
2

자세한 내용은 Math.Round 메서드를 참조하세요.

결과를 수용하기 위한 형식 변환

PowerShell은 정밀도를 잃지 않고 결과를 가장 잘 표현하는 .NET 숫자 형식을 자동으로 선택합니다. 예시:

2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double

작업의 결과가 형식에 비해 너무 크면 다음 예제와 같이 결과의 형식이 결과에 맞게 확장됩니다.

(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double

결과의 형식이 피연산자 중 하나와 항상 동일하지는 않습니다. 다음 예제에서는 음수 값을 부호 없는 정수로 캐스팅할 수 없으며 부호 없는 정수가 너무 커서 캐스팅할 Int32수 없습니다.

([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64

이 예제에서는 Int64 두 형식을 모두 수용할 수 있습니다.

형식은 System.Decimal 예외입니다. 두 피연산자 중 하나에 10진수 형식이 있으면 결과는 10진수 형식입니다. 10진수 값에 대해 너무 큰 결과는 오류입니다.

PS> [Decimal]::maxvalue
79228162514264337593543950335

PS> [Decimal]::maxvalue + 1
RuntimeException: Value was either too large or too small for a Decimal.

전체 자릿수의 잠재적 손실

형식 범위를 초과하는 결과가 있을 때마다 형식 변환으로 인해 정밀도가 손실될 위험이 있습니다. 예를 들어 충분히 큰 [long][int] 피연산자를 추가하면 피연산자는 변환됩니다 [double]. 이 예제에서는 9223372036854775807 정수의 최대값입니다 [long] . 값에 추가하면 범위 [long]가 오버플로됩니다.

PS> (9223372036854775807 + 2).GetType().FullName
System.Double

피연산자를 먼저 강제 [double] 변환했기 때문에 결과를 캐스팅하여 [ulong] 부정확한 결과를 생성합니다.

PS> [ulong](9223372036854775807 + 2)
9223372036854775808

먼저 더 큰 값을 [ulong] 정의하면 문제가 방지되고 올바른 결과가 생성됩니다.

PS> 9223372036854775807ul + 2
9223372036854775809

그러나 결과의 [double]범위를 [ulong] 초과하면

PS> ([ulong]::MaxValue + 1).GetType().FullName
System.Double

Bigint 산술 연산

숫자에 대한 [bigint] 산술 연산을 수행할 때 PowerShell은 모든 피연산자를 변환하여 [bigint]정수가 아닌 값이 잘리는 결과를 가져옵니다. 예를 들어 값은 [double] 변환[bigint]될 때로 1 잘립니다.1.9

PS> [bigint]1 / 1.9
1
PS> 1 / [bigint]1.9
1

이 동작은 다른 숫자 형식의 동작과 다릅니다. 이 예제에서는 [int] 결과를 [double]으로 [double] 나눕니다. 값으로 캐스팅 1.9 하면 [int] 값을 최대로 반올림합니다 2.

PS> 1 / 1.9
0.526315789473684
PS> 1 / [int]1.9
0.5

숫자가 아닌 형식 추가 및 곱하기

숫자, 문자열, 배열 및 해시 테이블을 추가할 수 있습니다. 또한 숫자, 문자열 및 배열을 곱할 수 있습니다. 그러나 해시 테이블을 곱할 수는 없습니다.

문자열, 배열 또는 해시 테이블을 추가하면 요소가 연결됩니다. 배열 또는 해시 테이블과 같은 컬렉션을 연결할 때 두 컬렉션의 개체를 포함하는 새 개체가 만들어집니다. 키가 같은 해시 테이블을 연결하려고 하면 작업이 실패합니다.

예를 들어 다음 명령은 두 개의 배열을 만든 다음 추가합니다.

$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C

다른 형식의 개체에 대해 산술 연산을 수행할 수도 있습니다. PowerShell이 수행하는 작업은 작업에서 가장 왼쪽 개체의 Microsoft .NET 형식에 의해 결정됩니다. PowerShell은 작업의 모든 개체를 첫 번째 개체의 .NET 형식으로 변환하려고 합니다. 개체를 변환하는 데 성공하면 첫 번째 개체의 .NET 형식에 적합한 작업을 수행합니다. 개체를 변환하지 못하면 작업이 실패합니다.

다음 예제에서는 다른 개체 형식을 포함하는 연산에서 더하기 및 곱하기 연산자를 사용하는 방법을 보여 줍니다.

$array = 1,2,3
$red = [ConsoleColor]::Red
$blue = [ConsoleColor]::Blue

"file" + 16      # result = "file16"
$array + 16      # result = 1,2,3,16
$array + "file"  # result = 1,2,3,"file"
$array * 2       # result = 1,2,3,1,2,3
"file" * 3       # result = "filefilefile"
$blue + 3        # result = Red
$red - 3         # result = Blue
$blue - $red     # result = -3
+ '123'          # result = 123

문을 평가하는 데 사용되는 메서드는 맨 왼쪽 개체에 의해 결정되기 때문에 PowerShell의 추가 및 곱하기는 엄격하게 커밋되지 않습니다. 예를 들어 항상 (a + b) 같지 (b + a)(ab) 는 않으며 항상 같지(ba)는 않습니다.

다음 예제에서는 이 원칙을 보여 줍니다.

PS> "file" + 16
file16

PS> 16 + "file"
InvalidArgument: can't convert value "file" to type "System.Int32". Error:
"Input string wasn't in a correct format."

해시 테이블은 약간 다른 경우입니다. 추가된 해시 테이블에 중복 키가 없는 한 다른 해시 테이블에 해시 테이블을 추가할 수 있습니다.

다음 예제에서는 서로 해시 테이블을 추가하는 방법을 보여 줍니다.

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c2="Server02"}
$hash1 + $hash2
Name                           Value
----                           -----
c2                             Server02
a                              1
b                              2
c1                             Server01
c                              3

다음 예제에서는 두 해시 테이블에서 키 중 하나가 중복되어 오류를 throw합니다.

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c="Server02"}
$hash1 + $hash2
OperationStopped:
Line |
   3 |  $hash1 + $hash2
     |  ~~~~~~~~~~~~~~~
     | Item has already been added. Key in dictionary: 'c'  Key being added: 'c'

또한 배열에 해시 테이블을 추가할 수 있습니다. 및 전체 해시 테이블이 배열의 항목이 됩니다.

$array1 = @(0, "Hello World", [datetime]::Now)
$hash1 = @{a=1; b=2}
$array2 = $array1 + $hash1
$array2
0
Hello World

Monday, June 12, 2017 3:05:46 PM

Key   : a
Value : 1
Name  : a

Key   : b
Value : 2
Name  : b

그러나 해시 테이블에 다른 형식을 추가할 수는 없습니다.

$hash1 + 2
InvalidOperation: A hash table can only be added to another hash table.

더하기 연산자는 매우 유용하지만 할당 연산자를 사용하여 해시 테이블 및 배열에 요소를 추가합니다. 자세한 내용은 about_assignment_operators 참조하세요. 다음 예제에서는 대입 연산자를 += 사용하여 배열에 항목을 추가합니다.

$array = @()
(0..2).foreach{ $array += $_ }
$array
0
1
2

산술 연산자 및 변수

산술 연산자를 변수와 함께 사용할 수도 있습니다. 연산자는 변수의 값에 따라 작동합니다. 다음 예제에서는 변수와 함께 산술 연산자를 사용하는 방법을 보여 줍니다.

PS> $intA = 6
PS> $intB = 4
PS> $intA + $intB
10

PS> $a = "Power"
PS> $b = "Shell"
PS> $a + $b
PowerShell

산술 연산자 및 명령

일반적으로 숫자, 문자열 및 배열이 있는 식에서 산술 연산자를 사용합니다. 그러나 명령이 반환하는 개체와 해당 개체의 속성과 함께 산술 연산자를 사용할 수도 있습니다.

다음 예제에서는 PowerShell 명령을 사용하여 식에서 산술 연산자를 사용하는 방법을 보여 줍니다.

(Get-Date) + (New-TimeSpan -day 1)

괄호 연산자는 cmdlet의 Get-Date 계산과 cmdlet 식의 New-TimeSpan -Day 1 계산을 해당 순서대로 강제합니다. 그런 다음 두 결과가 연산자를 사용하여 추가됩니다 + .

Get-Process | Where-Object { ($_.ws * 2) -gt 50mb }
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1896      39    50968      30620   264 1,572.55   1104 explorer
  12802      78   188468      81032   753 3,676.39   5676 OUTLOOK
    660       9    36168      26956   143    12.20    988 PowerShell
    561      14     6592      28144   110 1,010.09    496 services
   3476      80    34664      26092   234 ...45.69    876 svchost
    967      30    58804      59496   416   930.97   2508 WINWORD

위의 식에서 각 프로세스 작업 공간($_.ws)은 곱하고 2, 결과는 그보다 큰지 확인하기 위해 비교 50mb 됩니다.

비트 연산자

PowerShell은 비트 AND(), 포함 및 배타적 비트 OR 연산자(-band-bor및) 및 -bxorbitwise-NOT(-bnot)을 비롯한 표준 비트 연산자를 지원합니다.

PowerShell 2.0부터 모든 비트 연산자는 64비트 정수로 작동합니다.

PowerShell 3.0 -shr 부터 PowerShell에서 비트 산술 연산을 지원하기 위해 (shift-right) 및 -shl (shift-left)가 도입되었습니다.

PowerShell은 다음 비트 연산자를 지원합니다.

Operator 설명 결과
-band 비트 AND 10 -band 3 2
-bor 비트 OR(포함) 10 -bor 3 11
-bxor 비트 OR(배타적) 10 -bxor 3 9
-bnot 비트 NOT -bNot 10 -11
-shl 왼쪽으로 이동 102 -shl 2 408
-shr 오른쪽으로 이동 102 -shr 1 51

비트 연산자는 값의 이진 형식에 따라 작동합니다. 예를 들어 숫자 10의 비트 구조는 00001010(1 바이트 기준)이고 숫자 3의 비트 구조는 00000011. 비트 연산자를 사용하여 10~3을 비교하면 각 바이트의 개별 비트가 비교됩니다.

비트 AND 연산에서는 두 입력 비트가 모두 1인 경우에만 결과 비트가 1로 설정됩니다.

1010      (10)
0011      ( 3)
--------------  bAND
0010      ( 2)

비트 OR(포함) 연산에서는 입력 비트 중 하나 또는 둘 다 1일 때 결과 비트가 1로 설정됩니다. 결과 비트는 두 입력 비트가 모두 0으로 설정된 경우에만 0으로 설정됩니다.

1010      (10)
0011      ( 3)
--------------  bOR (inclusive)
1011      (11)

비트 OR(배타적) 작업에서 결과 비트는 입력 비트가 1일 때만 1로 설정됩니다.

1010      (10)
0011      ( 3)
--------------  bXOR (exclusive)
1001      ( 9)

비트 NOT 연산자는 값의 이진 보수를 생성하는 단항 연산자입니다. 비트 1은 0으로 설정되고 비트 0은 1로 설정됩니다.

예를 들어 0의 이진 보수는 -1, 부호 없는 최대 정수(0xFFFFFFFF) 및 -1의 이진 보수는 0입니다.

-bNot 10
-11
0000 0000 0000 1010  (10)
------------------------- bNOT
1111 1111 1111 0101  (-11, 0xFFFFFFF5)

비트 시프트-왼쪽 작업에서 모든 비트는 "n" 위치를 왼쪽으로 이동하며 여기서 "n"은 오른쪽 피연산자의 값입니다. 0은 해당 위치에 삽입됩니다.

결과 이진 결과
21 -shl 0 21 0001 0101
21 -shl 1 42 0010 1010
21 -shl 2 84 0101 0100

비트 시프트 오른쪽 작업에서 모든 비트는 오른쪽 피연산자에서 "n"을 지정하는 "n" 위치로 이동합니다. 시프트-오른쪽 연산자(-shr)는 부호 있는 값을 이동할 때 가장 왼쪽에 있는 위치에 부호 비트를 복사합니다. 부호 없는 값의 경우 맨 왼쪽 위치에 0이 삽입됩니다.

결과 이진 16진수
21 -shr 0 21 00010101 0x15
21 -shr 1 10 00001010 0x0A
21 -shr 2 5 00000101 0x05
21 -shr 31 0 00000000 0x00
21 -shr 32 21 00010101 0x15
21 -shr 64 21 00010101 0x15
21 -shr 65 10 00001010 0x0A
21 -shr 66 5 00000101 0x05
[int]::MaxValue -shr 1 1073741823 00111111111111111111111111111111 0x3FFFFFFF
[int]::MinValue -shr 1 -1073741824 11000000000000000000000000000000 0xC0000000
-1 -shr 1 -1 11111111111111111111111111111111 0xFFFFFFFF
(-21 -shr 1) -11 11111111111111111111111111110101 0xFFFFFFF5
(-21 -shr 2) -6 11111111111111111111111111111010 0xFFFFFFF4

참고 항목