| long |
| f (long x) |
| { |
| return x / (-0x7fffffffL - 1L); |
| } |
| |
| long |
| r (long x) |
| { |
| return x % (-0x7fffffffL - 1L); |
| } |
| |
| /* Since we have a negative divisor, this equation must hold for the |
| results of / and %; no specific results are guaranteed. */ |
| long |
| std_eqn (long num, long denom, long quot, long rem) |
| { |
| /* For completeness, a check for "ABS (rem) < ABS (denom)" belongs here, |
| but causes trouble on 32-bit machines and isn't worthwhile. */ |
| return quot * (-0x7fffffffL - 1L) + rem == num; |
| } |
| |
| long nums[] = |
| { |
| -1L, 0x7fffffffL, -0x7fffffffL - 1L |
| }; |
| |
| main () |
| { |
| int i; |
| |
| for (i = 0; |
| i < sizeof (nums) / sizeof (nums[0]); |
| i++) |
| if (std_eqn (nums[i], -0x7fffffffL - 1L, f (nums[i]), r (nums[i])) == 0) |
| abort (); |
| |
| exit (0); |
| } |