모듈러스를 잘못하고 있습니까? Java -13 % 64
에서는 평가해야 -13
하지만 51
.
%
나머지 연산자입니다.
모듈러스를 잘못하고 있습니까? 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;
}
x % y
A) x
가 음수이면 나머지는 음수 x % y == -(-x % y)
입니다. B)의 부호는 y
효과가 없습니다. 즉x % y == x % -y
"수학적으로"둘 다 정확하기 때문에 :
-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
-13 % 64 = 51
내가 기대했을 때 Java가 나에게주는 이유는 -13
무엇입니까?"입니다.
Java에 대한 결과가 잘못되었습니다. 어떻게 도달했는지 (귀하의 프로그램, 구현 및 Java 버전) 컨텍스트를 제공하십시오.
로부터 Java 언어 사양
15.17.3 나머지 연산자 %
[...]
이진 숫자 승격 (§5.6.2) 후 정수인 피연산자에 대한 나머지 연산은 (a / b) * b + (a % b)가 다음과 같은 결과 값을 생성합니다. ㅏ.
15.17.2 나누기 연산자 /
[...]
정수 나누기는 0으로 반올림합니다.
/는 0으로 반올림되므로 (결과는 0)이 경우 %의 결과는 음수 여야합니다.
int result = (-5) % 3;
-2 int result = (-3) % 5;
제공 -3 제공 일반적으로 int result = (-a) % b;
| -a | > b 적절한 결과를 얻으려면 | -a | <b 우리는 제수를 감싸 야합니다. int result = ((-a) % b) + b;
음수 a 또는 int result = (((-a) % b) + b) % b;
양수 또는 음수 a.
(-3) % 5
정의에 따른 올바른 결과는 -3
이며 올바른 Java 구현은 해당 결과를 생성해야합니다.
(-3)%5
참으로 제공 -3
, 우리는 긍정적 인 나머지를 원한다면 우리는 5를 추가해야하고 결과가 될 것2
당신이 사용할 수있는
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
.. (비록 당신은 아마 더 읽을 수 있습니다.)
[0, sign(divisor) * divisor)
대신 범위에 있기를 원할 때 유용합니다 [0, sign(dividend) * divisor)
.
음수 피연산자가있는 모듈로 산술은 언어 설계자에 의해 정의되며, 언어 설계자는이를 언어 구현에 맡기고 정의를 CPU 아키텍처에 연기 할 수 있습니다.
Java 언어 정의를 찾을 수 없습니다. 나머지 연산자 %에
대한 Java 언어 사양 인 Ishtar 는 결과의 부호가 분자의 부호와 동일하다고 말합니다.
x = x + m = x - m
계수 m
.
그래서 -13 = -13 + 64
모듈러스 64
와 -13 = 51
모듈러스에서 64
.
가정 Z = X * d + r
하면, 0 < r < X
다음 부문에서 Z/X
우리가 부르는 r
나머지를.
Z % X
의 나머지를 반환합니다 Z/X
.
Java 최신 버전에서는 -13%64 = -13
. 대답은 항상 분자의 부호를 갖습니다.
이 경우 Java가 51을 반환한다고 생각하지 않습니다. Mac에서 Java 8을 실행 중입니다.
-13 % 64 = -13
프로그램:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}