-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가 최종 결과가 되는
그런 형태인거 같은데..
왜 이런 차이가 있는걸까요
나머지 값을 구하기 위해서는 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
)