#include "intprops.h" _Bool signed1_overflow (signed char a, signed char b) { signed char r; return INT_ADD_WRAPV (a, b, &r); } _Bool my_signed1_overflow (signed char a, signed char b) { return (((int) (signed char) ((unsigned char) a + (unsigned char) b) - (int) a) ^ (int) b) < 0; } _Bool signed2_overflow (short a, short b) { short r; return INT_ADD_WRAPV (a, b, &r); } _Bool my_signed2_overflow (short a, short b) { return (((int) (short) ((unsigned short) a + (unsigned short) b) - (int) a) ^ (int) b) < 0; } _Bool signed4_overflow (int a, int b) { int r; return INT_ADD_WRAPV (a, b, &r); } _Bool my_signed4_overflow (int a, int b) { return (((long long) (int) ((unsigned int) a + (unsigned int) b) - (long long) a) ^ (long long) b) < 0; } #ifdef TEST #include int main () { int u, v; /* Verify that signed1_overflow and my_signed1_overflow agree. */ for (u = -0x8; u <= 0x7; u++) for (v = -0x8; v <= 0x7; v++) { int a = u << 4; int b = v << 4; int x = signed1_overflow (a, b); int y = my_signed1_overflow (a, b); if (x != y) printf ("signed1 mistake: a=%d b=%d x=%d y=%d\n", a, b, x, y); } /* Verify that signed2_overflow and my_signed2_overflow agree. */ for (u = -0x8; u <= 0x7; u++) for (v = -0x8; v <= 0x7; v++) { int a = u << 12; int b = v << 12; int x = signed2_overflow (a, b); int y = my_signed2_overflow (a, b); if (x != y) printf ("signed2 mistake: a=%d b=%d x=%d y=%d\n", a, b, x, y); } /* Verify that signed4_overflow and my_signed4_overflow agree. */ for (u = -0x8; u <= 0x7; u++) for (v = -0x8; v <= 0x7; v++) { int a = u << 28; int b = v << 28; int x = signed4_overflow (a, b); int y = my_signed4_overflow (a, b); if (x != y) printf ("signed4 mistake: a=%d b=%d x=%d y=%d\n", a, b, x, y); } return 0; } #endif