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