2011-02-18 1 views
3

왜 모듈러스 연산자 (%)의 결과가 C#의 오른쪽이 아닌 왼쪽으로 내재적으로 변환되는 이유는 무엇입니까?

다음 코드를 취하십시오.

long longInteger = 42; 
int normalInteger = 23; 
object rem = longInteger % normalInteger; 

remlongInteger/normalInteger의 나머지이면, 나머지는 항상 작은 크기의 "int"즉 제수로 한정되어서는 안됩니까? 그러나 C#에서는 위의 코드 결과가 remlong가됩니다.

데이터 손실없이 remint로 변환하는 것이 안전합니까?

int remainder = Convert.ToInt32(rem); 
+0

연산자 이름이 "모듈러스"에서 "모듈로"로 편집되었습니다. modulo가 올바른 이름 인 것처럼 보이지만 http://en.wikipedia.org/wiki/Modulo_operation 그러나 MSDN에는 "modulus"가 있습니다 http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx MSDN이 잘못되었을 수 있다고 생각합니까? – jasonsirota

답변

4

int는 다른 피연산자 일치 long으로 변환 될 수 있도록하는 longint 소요 모듈러 연산자 과부하 없다.

저수준에서 살펴보면, CPU에서는 모듈로 계산을위한 별도의 지시가 없으며, 나누기 연산의 결과 중 하나 일뿐입니다. 작업 결과는 나누기 결과와 미리 알림 결과입니다. 둘 다 같은 크기이므로 나누기 결과는 long이어야하며 알림도 마찬가지입니다.

리마인더가 제수보다 작아야하므로 제수가 int 인 경우 결과를 int으로 안전하게 전송할 수 있습니다.

+0

x86의 하드웨어 분할 명령어는 64 비트 배수 및 32 비트 제수를 허용하고 32 비트 몫 및 32 비트 나머지를 생성합니다. 제수가 32 비트이지만 몫이 32 비트를 초과 할 수있는 경우 비교 명령을 사용하여 오버플로가 발생할 경우 분할을 분할하거나 분할을 무조건 분할해야 할 수 있습니다. JIT가 32 비트에 맞지 않는 값을 실제로 보유 할 수 없다는 사실을 깨닫지 못한다면 배당금을 32 비트로 승격 시키려면 추가 코드가 필요합니다. – supercat

0

예, 변환 기능은 결과를 반올림합니다. 그렇다면 그것이 당신에게 유익한 것인지 아닌지를 알아야합니다.

+0

결과가 길어서 어떤 종류의 반올림도 없습니다. –

+0

전화를 변환 함수의 참조 후 만들 : Convert.ToInt32 (rem); int를 반환합니다. – JAiro

+0

값이 정확하고 비접촉이 아니기 때문에 유형 변환이 있지만 [반올림] (http://en.wikipedia.org/wiki/Rounding)이 없습니다. –

1

두 정수가 무엇이든 상관없이 결과는 "normalInteger"보다 낮아야합니다. 따라서 결과 "rem"은 int 유형의 제한으로 제한됩니다. 따라서 데이터를 손실하지 않고 rem을 int로 변환하는 것이 안전합니다.

관련 문제