0

C 및 다른 많은 프로그래밍 언어에서 정의 된대로 정수 나누기에서 잘 알려진 일관성이 없습니다. 정수 N으로 나누는 것은 0 .. N 대신 0..N 범위의 나머지를 산출합니다. IMO는 일부 응용 프로그램에 부정적인 영향을 미칩니다. 예를 들어 정수 격자로 정의 된 이미지를 표시하는 경우 이미지 영역 외부에 (0,0)을 넣는 것이 좋습니다. 그렇지 않으면 x == 0에 보이는 선이 표시되고 일부 이미지 조작에서 y == 0에 또 하나.정수 나누기가 음의 무한대가 아닌 0으로 자르는 이유는 무엇입니까?

잘림이 0으로 설정되면 음수 무한대로 잘리는 것이 프로그래밍 의도에 도움이 될 수있는 실용적인 정수 부문 사용의 예를 들려 줄 수 있습니까?

+0

첫 번째 질문은 주로 의견을 기반으로하는 답변을 요구합니다. 두 번째 질문은 IMHO가 너무 광범위하다는 것입니다. 조금 더 노력하면 멋진 작은 trifecta을 갖게됩니다. –

+0

@CaptainObvlious, aye-aye, Captain. – Michael

+1

이것은 고대 C 또는 C++에서 최근까지 필수 동작이 아니 었습니다. 반올림의 방향과 나머지의 부호는 모두 지정해야했지만 아직 일치하지 않았으므로 그 부분을 소개하는 메모를 검토 할 수 있습니다. 변화. –

답변

4

이것은 프로그래밍 언어 디자인의 문제가 아닙니다.

고급 프로그래밍 언어는 저급 언어와의 일관성을 위해 잘립니다.

저수준 언어는 하드웨어 작동 때문에 잘립니다.

하드웨어의 최신 세대는 초기 세대와 역 호환되도록 선택했습니다.

정말로이 질문에 대답하려면 waaaaay를 뒤로 가져 가야합니다. 그 이유는 "carry chain을 짧게 만들었습니다"와 같이 미묘 할 수 있습니다.

// both of these are true if integer division truncates toward zero, else uncertain 
-1 * b/c == -1 * (b/c) 
-1 * b % c == -1 * (b % c) % c 

보존하기보다는 좋은 정체성과 같습니다

다른 선택은 분배 법칙을 나누기 것을, 그러나, 유의하시기 바랍니다.

+0

기존의 설명이 질문에 대답합니다. 불행히도 돌로 새겨 져있는 편리한 바로 가기 중 하나입니다. 그러나 "distributivity"설명이 사실이라면 더 재미있을 것입니다. 그러나 -2 * -2/-3을 시도해보십시오. – Michael

+0

@ 마이클 : 오, 네. 나는 그것을 쓸 때'a = -1'에 대해서 생각하고 있었고, 실제로 그것이 일반화 될지 테스트하지 않았습니다. –

+0

+1 (나는 컴퓨터가 하드웨어에서 정수 나누기를 수행했다면 운이 좋았을 때 기억할만큼 늙었습니다.) –