[java] Java는 음수로 모듈러스 계산을 어떻게 수행합니까?

모듈러스를 잘못하고 있습니까? Java -13 % 64에서는 평가해야 -13하지만 51.



답변

음수의 계수에 대한 두 정의가 모두 사용됩니다. 일부 언어는 하나의 정의를 사용하고 일부는 다른 정의를 사용합니다.

음수 입력에 대해 음수를 얻으려면 다음을 사용할 수 있습니다.

int r = x % n;
if (r > 0 && x < 0)
{
    r -= n;
}

마찬가지로 음수 입력에서 음수를 반환하는 언어를 사용하고 있고 양수를 선호하는 경우 :

int r = x % n;
if (r < 0)
{
    r += n;
}


답변

“수학적으로”둘 다 정확하기 때문에 :

-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)

옵션 중 하나는 Java 언어 개발자가 선택해야했으며 다음을 선택했습니다.

결과의 부호는 배당금의 부호와 같습니다.

Java 사양에서 다음과 같이 말합니다.

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3


답변

Java로 작업하고 있습니까? Java는 예상대로 -13 % 64 = -13을 제공하기 때문입니다. 배당금의 징조!


답변

Java에 대한 결과가 잘못되었습니다. 어떻게 도달했는지 (귀하의 프로그램, 구현 및 Java 버전) 컨텍스트를 제공하십시오.

로부터 Java 언어 사양

15.17.3 나머지 연산자 %

[…]

이진 숫자 승격 (§5.6.2) 후 정수인 피연산자에 대한 나머지 연산은 (a / b) * b + (a % b)가 다음과 같은 결과 값을 생성합니다. ㅏ.

15.17.2 나누기 연산자 /
[…]
정수 나누기는 0으로 반올림합니다.

/는 0으로 반올림되므로 (결과는 0)이 경우 %의 결과는 음수 여야합니다.


답변

당신이 사용할 수있는

(x % n) - (x < 0 ? n : 0);


답변

당신의 대답은 위키피디아에 있습니다 :
모듈로 연산

Java에서 모듈로 연산의 사인온은 배당금의 사인온과 동일합니다. 나머지 나누기 연산에 대해 이야기하고 있기 때문에 -13/64 = 0이므로 -13을 반환합니다. -13-0 = -13.

편집 : 죄송합니다, 귀하의 질문을 오해했습니다 … 당신이 맞습니다, 자바는 -13을 제공해야합니다. 더 많은 주변 코드를 제공 할 수 있습니까?


답변

음수 피연산자가있는 모듈로 산술은 언어 설계자에 의해 정의되며, 언어 설계자는이를 언어 구현에 맡기고 정의를 CPU 아키텍처에 연기 할 수 있습니다.

Java 언어 정의를 찾을 수 없습니다. 나머지 연산자 %에
대한 Java 언어 사양 인 Ishtar 는 결과의 부호가 분자의 부호와 동일하다고 말합니다.