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

Reply via email to