0

Это хорошо известная несогласованность в целых делениях, как определено в C и многих других языках программирования: деление на целое число N дает остаток в диапазоне 0..N, а не 0 .. | N |. IMO это отрицательно влияет на некоторые приложения, например, если вы показываете изображение, определенное на целочисленной сетке, лучше поместить (0,0) за пределы области изображения: в противном случае вы получите видимую строку в x == 0 и другой в y == 0 на некоторых операциях с изображениями.Почему целочисленное деление усекает 0, а не отрицательную бесконечность?

Не могли бы вы назвать пример практического использования целочисленного деления, где усечение до 0 будет служить намерению программирования лучше, чем усечение до отрицательной бесконечности?

+0

Ваш первый вопрос требует ответов, которые будут основываться главным образом на мнении. Второй вопрос - IMHO слишком широк. Немного больше усилий, и у тебя будет приятная маленькая трифекта. –

+0

@CaptainObvlious, aye-aye, Captain. – Michael

+1

Это не было обязательным поведением в древнем C или C++ до недавнего времени - до этого не было указано как направление округления, так и знак остатка, хотя они должны были соответствовать, поэтому вы можете рассмотреть примечания, представляющие, что изменение. –

ответ

4

Это не вопрос программирования языка программирования.

Языки программирования высокого уровня усекаются для согласованности с низкоуровневыми языками.

Языки низкого уровня усекаются, потому что это то, что делает аппаратная операция.

Более поздние поколения аппаратных средств выбрали обратную совместимость с ранними поколениями.

Чтобы действительно ответить на этот вопрос, вам нужно вернуться в waaaaay, и причина может быть такой же тонкой, как «она сделала цепочку переноса короче».

Пожалуйста, обратите внимание, однако, что любой другой выбор ломает дистрибутивности:

// 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

Унаследованное объяснение отвечает на вопрос: один из тех удобных по времени ярлыков, которые, к сожалению, вырезаны из камня. Однако я бы нашел объяснение «дистрибутивности» более интересным, если бы это было правдой. Это не правда: try -2 * -2/-3. – Michael

+0

@ Майкл: Эрр, да. Я думал о 'a = -1', когда писал это, и не проверял, действительно ли это будет обобщаться. –

+0

+1 (Я достаточно взрослый, чтобы помнить, когда вам повезло, если ваш компьютер вообще делит на аппаратное обеспечение.) –

Смежные вопросы