1 long
f(long x)2 f (long x)
3 {
4 return x / (-0x7fffffffL - 1L);
5 }
6
7 long
r(long x)8 r (long x)
9 {
10 return x % (-0x7fffffffL - 1L);
11 }
12
13 /* Since we have a negative divisor, this equation must hold for the
14 results of / and %; no specific results are guaranteed. */
15 long
std_eqn(long num,long denom,long quot,long rem)16 std_eqn (long num, long denom, long quot, long rem)
17 {
18 /* For completeness, a check for "ABS (rem) < ABS (denom)" belongs here,
19 but causes trouble on 32-bit machines and isn't worthwhile. */
20 return quot * (-0x7fffffffL - 1L) + rem == num;
21 }
22
23 long nums[] =
24 {
25 -1L, 0x7fffffffL, -0x7fffffffL - 1L
26 };
27
main()28 main ()
29 {
30 int i;
31
32 for (i = 0;
33 i < sizeof (nums) / sizeof (nums[0]);
34 i++)
35 if (std_eqn (nums[i], -0x7fffffffL - 1L, f (nums[i]), r (nums[i])) == 0)
36 abort ();
37
38 exit (0);
39 }
40