완료됨
음수를 나머지 계산하는 방법??

-2147483648 % 10 = -8이 되는게 이해가 안가서 확인해봤는데요.

C언어에서는
-1%10 = -1
-2%10 = -2
-3%10 = -3
이 되는 반면

파이썬에서는
-1%10 = 9
-2%10 = 8
-3%10 = 7
이더라구요.

왜 이런 차이가 생기는지
일단 C언어에서 연산과정을 확인하려고
어셈블 봣는데
대뜸 이상한 값을 imul하고 쉬프트하고 그러는거 보니까
어셈블 보고 이해하는건 엄두가 안나더라고요.

대충 결과값만 놓고 봤을때
C언어에서
-105 %10을 계산한다면
-를 떼고
105%10을 계산한 결과 5에 -를 다시 붙여줘서 -5가 되는
그런 원리라고 생각하면 되는거 같고

파이썬은 -16%3을 한다고 하면
16%3을 한 결과 1을 3에다 뺀 2가 최종 결과가 되는
그런 형태인거 같은데..

왜 이런 차이가 있는걸까요

#시스템해킹
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
5unkn0wn
강의 수강: 50

나머지 값을 구하기 위해서는 C와 파이썬의 나눗셈에 대해 먼저 이해해야 합니다. C의 경우는 정수 나눗셈 연산 결과 (몫)의 소수부를 버림 (truncate) 하고, 파이썬의 경우 내림 (floor) 합니다. 따라서 -16 / 3-5.33333... 이기 때문에 C에서는 -5, 파이썬에서는 -6의 결과를 얻게됩니다.

다음으로 나머지 값은 피제수 (dividend)를 제수 (divisor)로 나눴을 때 더 이상 나눌 수 없는 값을 의미합니다. 따라서 몫 * 제수 + 나머지 == 피제수 의 식을 만족해야 합니다.

위의 식을 이용해 C와 파이썬에서의 나머지 값을 계산하게 되면, C는 -5 * 3 + a == -16을 만족하는 a가 나머지 값이 되게 됩니다. 따라서 a-1이 됩니다. 반면 파이썬은 -6 * 3 + a == -16을 만족하는 a가 나머지이기 때문에 2가 나머지 값이 되게 됩니다.

간편하게 음수 나머지 연산의 경우, C의 나머지 연산 결과에 제수를 더하면 파이썬의 나머지 연산 결과가 된다고 계산하시면 될 것 같습니다. (-1 + 3 == 2)

2021.11.17. 14:10