On 3/14/21 9:47 PM, Paul Eggert wrote:
I expect you meant something more like the attached foo1.c.
... which I forgot to attach. Here it is.
#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 <stdio.h>
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