1#include <limits.h>
2
3extern void abort ();
4
5int test1(int x)
6{
7  return ~(x ^ INT_MIN);
8}
9
10unsigned int test1u(unsigned int x)
11{
12  return ~(x ^ (unsigned int)INT_MIN);
13}
14
15int test2(int x)
16{
17  return ~(x + INT_MIN);
18}
19
20unsigned int test2u(unsigned int x)
21{
22  return ~(x + (unsigned int)INT_MIN);
23}
24
25int test3(int x)
26{
27  return ~(x - INT_MIN);
28}
29
30unsigned int test3u(unsigned int x)
31{
32  return ~(x - (unsigned int)INT_MIN);
33}
34
35int test4(int x)
36{
37  int y = INT_MIN;
38  return ~(x ^ y);
39}
40
41unsigned int test4u(unsigned int x)
42{
43  unsigned int y = (unsigned int)INT_MIN;
44  return ~(x ^ y);
45}
46
47int test5(int x)
48{
49  int y = INT_MIN;
50  return ~(x + y);
51}
52
53unsigned int test5u(unsigned int x)
54{
55  unsigned int y = (unsigned int)INT_MIN;
56  return ~(x + y);
57}
58
59int test6(int x)
60{
61  int y = INT_MIN;
62  return ~(x - y);
63}
64
65unsigned int test6u(unsigned int x)
66{
67  unsigned int y = (unsigned int)INT_MIN;
68  return ~(x - y);
69}
70
71
72
73void test(int a, int b)
74{
75  if (test1(a) != b)
76    abort();
77  if (test2(a) != b)
78    abort();
79  if (test3(a) != b)
80    abort();
81  if (test4(a) != b)
82    abort();
83  if (test5(a) != b)
84    abort();
85  if (test6(a) != b)
86    abort();
87}
88
89void testu(unsigned int a, unsigned int b)
90{
91  if (test1u(a) != b)
92    abort();
93  if (test2u(a) != b)
94    abort();
95  if (test3u(a) != b)
96    abort();
97  if (test4u(a) != b)
98    abort();
99  if (test5u(a) != b)
100    abort();
101  if (test6u(a) != b)
102    abort();
103}
104
105
106int main()
107{
108#if INT_MAX == 2147483647
109  test(0x00000000,0x7fffffff);
110  test(0x80000000,0xffffffff);
111  test(0x12345678,0x6dcba987);
112  test(0x92345678,0xedcba987);
113  test(0x7fffffff,0x00000000);
114  test(0xffffffff,0x80000000);
115
116  testu(0x00000000,0x7fffffff);
117  testu(0x80000000,0xffffffff);
118  testu(0x12345678,0x6dcba987);
119  testu(0x92345678,0xedcba987);
120  testu(0x7fffffff,0x00000000);
121  testu(0xffffffff,0x80000000);
122#endif
123
124#if INT_MAX == 32767
125  test(0x0000,0x7fff);
126  test(0x8000,0xffff);
127  test(0x1234,0x6dcb);
128  test(0x9234,0xedcb);
129  test(0x7fff,0x0000);
130  test(0xffff,0x8000);
131
132  testu(0x0000,0x7fff);
133  testu(0x8000,0xffff);
134  testu(0x1234,0x6dcb);
135  testu(0x9234,0xedcb);
136  testu(0x7fff,0x0000);
137  testu(0xffff,0x8000);
138#endif
139
140  return 0;
141}
142
143