Language agnostic 为什么整数除法截断为0而不是负无穷大?

Language agnostic 为什么整数除法截断为0而不是负无穷大?,language-agnostic,integer,programming-languages,language-lawyer,language-design,Language Agnostic,Integer,Programming Languages,Language Lawyer,Language Design,正如C和许多其他编程语言所定义的那样,整数除法中存在一个众所周知的不一致性:被整数N除法会产生0..N范围内的余数,而不是0..N |。在我看来,这会对某些应用程序产生负面影响,例如,如果在整数网格上显示由定义的图像,则最好将0,0置于图像区域之外:否则,在某些图像操作中,将在x==0处获得一条可见线,在y==0处获得另一条可见线 你能举出一个实际的整数除法用法的例子吗?在这个例子中,截断为0比截断为负无穷大更符合编程目的。这实际上不是编程语言设计的问题 高级编程语言截断以与低级语言保持一致 低

正如C和许多其他编程语言所定义的那样,整数除法中存在一个众所周知的不一致性:被整数N除法会产生0..N范围内的余数,而不是0..N |。在我看来,这会对某些应用程序产生负面影响,例如,如果在整数网格上显示由定义的图像,则最好将0,0置于图像区域之外:否则,在某些图像操作中,将在x==0处获得一条可见线,在y==0处获得另一条可见线


你能举出一个实际的整数除法用法的例子吗?在这个例子中,截断为0比截断为负无穷大更符合编程目的。

这实际上不是编程语言设计的问题

高级编程语言截断以与低级语言保持一致

低级语言会截断,因为硬件操作就是这样做的

后几代硬件选择与前几代向后兼容

要真正回答这个问题,你必须回过头来,原因可能很微妙,因为它使运输链变短了

但请注意,任何其他选择都会破坏分配性:

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

这不是编程语言设计的问题,真的

高级编程语言截断以与低级语言保持一致

低级语言会截断,因为硬件操作就是这样做的

后几代硬件选择与前几代向后兼容

要真正回答这个问题,你必须回过头来,原因可能很微妙,因为它使运输链变短了

但请注意,任何其他选择都会破坏分配性:

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

你的第一个问题要求的答案将主要基于观点。你的第二个问题太宽泛了。多一点努力,你会有一个不错的小三部曲。“队长,Yay-Ye,船长。这不是以前C或C++中的行为,直到最近,舍入的方向和剩余的符号都没有明确说明。虽然他们被要求匹配-所以你可能希望回顾介绍这一变化的注释。你的第一个问题要求主要基于观点的答案。你的第二个问题太宽泛了。多一点努力,你会有一个不错的小三部曲。“队长,Yay-Ye,船长。这不是以前C或C++中的行为,直到最近,舍入的方向和剩余的符号都没有明确说明。虽然它们必须匹配-所以你可能希望回顾一下介绍这一变化的注释。遗留解释回答了这个问题:不幸的是,当时的快捷方式之一已经刻在石头上。然而,如果分布性解释是真的,我会发现它更有趣。但这不是真的:试试-2*-2/-3。@Michael:呃,是的。当我写这篇文章的时候,我在想a=-1,但没有测试它是否真的可以推广。+1我已经足够大了,记得当你的计算机在硬件上进行整数除法时你是幸运的。我认为你的答案是好的。还有一个事实。编译器可能会降低强度。例如,假设N是8,编译器可能会右移。还有其他一些恒等式可能会将除法的强度降低为一些更简单、更快的数学运算。@artlessnoise:强度的降低实际上是无关紧要的。除非实现了一种语言,使得没有整数除法操作使用硬件指令进行整数除法,否则该硬件指令的行为将浮出水面。传统的解释回答了这个问题:当时那些方便的快捷方式之一不幸地被刻在了石头上。然而,如果分布性解释是真的,我会发现它更有趣。但这不是真的:试试-2*-2/-3。@Michael:呃,是的。当我写这篇文章的时候,我在想a=-1,但没有测试它是否真的可以推广。+1我已经足够大了,记得当你的计算机在硬件上进行整数除法时你是幸运的。我认为你的答案是好的。还有一个事实。编译器可能会降低强度。例如,假设N是8,编译器可能会右移。还有其他一些恒等式可能会将除法的强度降低为一些更简单、更快的数学运算。@artlessnoise:强度的降低实际上是无关紧要的。除非实现了一种语言,使得没有整数除法操作使用硬件指令进行整数除法,否则该硬件指令的行为将浮出水面。