f1 (unsigned int x, unsigned int y) { if (x == 0) dummy (); x -= y; /* 0xfffffff2 < 0x80000000? */ if (x < ~(~(unsigned int) 0 >> 1)) abort (); return x; } f2 (unsigned long int x, unsigned long int y) { if (x == 0) dummy (); x -= y; /* 0xfffffff2 < 0x80000000? */ if (x < ~(~(unsigned long int) 0 >> 1)) abort (); return x; } dummy () {} main () { /* 0x7ffffff3 0x80000001 */ f1 ((~(unsigned int) 0 >> 1) - 12, ~(~(unsigned int) 0 >> 1) + 1); f2 ((~(unsigned long int) 0 >> 1) - 12, ~(~(unsigned long int) 0 >> 1) + 1); exit (0); }