Here is a paper comparing the three definitions: https://dl.acm.org/doi/pdf/10.1145/128861.128862

It basically argues Euclidean division is best, flooring division second best, and truncating is the worst. I agree with this.

I also agree negative divisors are not very useful, and Euclidean and flooring definitions are same for positive divisors, so the first two are almost equivalent in practice.

If a user actually cares about negative numerators, then what they are getting most of the time as the result of this design choice is: a slightly faster operation, but giving a "wrong" answer (i.e. not what they actually want). That's not a great trade-off. So as the result of this, they have to deal with it and patch it up in software, which ends up being both less efficient, and error-prone.

I think the adjustments required are very easy compared to the cost of performing the whole division algorithm. Maybe it's not zero cost, but it's small. I'm not even sure it would require adding any more cycles in hardware: after all, it's negating and sometimes offsetting by one. Negating a number in two's complement is already a bitwise not and offsetting by one. I suspect it could all be pretty streamlined hardware, perhaps at roughly the same cost.

In any case, I'd much prefer a programming language did that, even if the CPU doesn't directly support it in hardware and it requires adding a couple assembly instructions after signed division. If I want the most efficient division, I can always use unsigned operands.

Also like I said, the current situation is reversed if the denominator is known to be a power of 2. Flooring is easier. If you do `x / 2`

(a very common scenario), the generated assembly first does a floor division by a bit shift, and then patches it up to simulate truncating division by offsetting it by 1 for odd negative numerators. That's pretty perverse.

Same thing if you do `x % 2`

for signed x. It will first mask off the bottom bit (which is what you really want 99.9% of the time), and then it will add assembly instructions to make sure you get -1 rather than 1 for negative x (which I have never seen any practical application for).