본문 바로가기

old drawer/programming

[배치파일] 3강 정수형 수치연산

고급 배치파일 제 003강 : 정수형 수치연산

입력문, 제어문에 이어 이제 정수를 처리해 봅시다.

◆ set /a 기본적인 수치처리

1강에서 그냥 set a=123 이라고 하면 a에 문자열 123이 저장되었는 걸 배웠습니다.

또, set /p b=입력: 으로 입력문을 받았습니다.

이번엔 set /a 로 수치데이터 저장 및 연산에 대해 알아봅시다.


set /a 변수=식이나 값 및 변수

(연산자는 +,-,*,/,%%(나머지) 의 산술 연산 뿐만 아니라, <<, >>, ^, &, | 등의 비트 연산자등

C언어에서 사용되는 연산자 이용가능, 단, 숫자는 9자리까지 연산가능)


예를들어 먼저, 예제를 봅시다.

파일 명 : 3-1.bat

@echo off
echo ==============================
echo 배치파일 예제 3-1 - 정수형 수치연산
echo ==============================
echo.
set /a a=123
set /a b=456
set /a c=a+b
echo %a% + %b% = %c%
pause>nul

일단 실행해 보면 123+456=579 가 나타납니다.
먼저 a와 b에 각각 123과 456을 저장한 뒤
c에 변수 a와 b를 각각 더합니다.
그 결과 c는 a와 b를 더한 값인 579가 저장되는 거죠.

파일 명 : 3-2.bat

@echo off
echo ==============================
echo 배치파일 예제 3-2 - 정수형 수치연산
echo ==============================
echo.
set a=123
set b=456
set /a c=a+b
echo %a% + %b% = %c%
pause>nul

사실 a와 b 앞에 /a를 생략해도 됩니다.
그 이유는 항상 set 명령어를 쓴 결과값은 무조건 문자열로 저장이 됩니다.
따라서, 연산자나, 변수 또는 연산자가 아닌 단순한 숫자 상수라면 /a를 생략하여도 문제가 없습니다.
하지만 주의할 점은, 위 set /a c=a+b에서
set  c=a+b
로 할경우, 해당 연산식은 계산이 안될 뿐만 아니라, a와 b 역시 숫자로 치환이 되지 않습니다.
따라서 c는 그냥 "a+b" 가 저장됩니다.
또한
set c=12+12

역시나, 그냥 "12+12" 가 저장됩니다. 왜? /a가 지정되지 않으면 그 값을 그냥 문자열로 보기 때문입니다.

그리고, a와 b의 값을 치환하되 계산을 하고 싶지 않으시다면

set  c=%a%+%b%

이와같이 /a를 빼며, 대신 변수에 %로 감싸 줍니다.

그러면 "123+456" 가 저장이 됩니다.

마지막으로,

set /a c=123456789*999

이 경우는 수학적으로는 문제가 되지 않습니다.

하지만 시스템에서 처리할 수 있는 정수의 한계 (9자리) 를 초과해서 에러가 발생됩니다.



파일 명 : 3-3.bat

@echo off
echo ==============================
echo 배치파일 예제 3-3 - 정수형 수치연산 : 사칙연산 하기
echo ==============================
echo.
set /p a=첫번째 숫자 :
set /p b=두번째 숫자 :
set /a c=a+b
echo %a% + %b% = %c%

set /a c=a-b
echo %a% - %b% = %c%

set /a c=a*b
echo %a% * %b% = %c%

set /a c=a/b
echo %a% / %b% = %c%

set /a c=a%%b
echo %a% %% %b% = %c%

pause>nul



실행 결과(입력은 예제)
첫번째 숫자 :456
두번째 숫자 :123
456 + 123 = 579
456 - 123 = 333
456 * 123 = 56088
456 / 123 = 3
456 % 123 = 87

이와 같이 set, set /p와 set /a 를 혼용해서 사용할 수 있으며, 이와같은 결과를 얻을 수 있습니다.

그리고, / (나누기) 연산은 정수 연산이므로, 소숫점을 버린 몫을 저장하게 되며,

%% (나머지) 연산은 나눗셈을 한 나머지를 저장하게 됩니다.

%가 아닌 %%인 이유는 실제 배치파일 인터프리터는

C언어에서의 \\과 마찬가지로 %%를 %로 인식하므로, %%를 쓰면 됩니다.