egcs 1.1.2 problem; shift on integers gives unexpected sign extension.

Michael Widenius monty@monty.pp.sci.fi
Mon Feb 28 11:55:00 GMT 2000


Hi!

Machine:          Alpha DS20 with 2G RAM and 2x500 Mz CPU's
Operating system: SuSE: 6.3 Linux, kernel:  SuSE 2.2.13-SMP

I am trying to get MySQL to work reliable on Alpha Linux:


****************************
egcs 1.1.2 problem;  shift on integers gives unexpected sign extension.
****************************

Just save the following program as shift-bug.c and follow the instructions in
the comment:

---------
/*
** shift on integers gives unexpected sign extension.
** This 'may' be right, but it's not predictable and SHOULD at least give
** a warning on 64 bit architectures!

How about adding a warning when doing shift on unsigned values
on 64 bit machines?

Test:

(/my/bugs) gcc -v
Reading specs from /usr/lib/gcc-lib/alpha-unknown-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
(/my/bugs) gcc -Wall shift-bug.c -o shift-bug
(/my/bugs) shift-bug
1 << 31 = -2147483648 = 0x ffffffff80000000
1U << 31 = 2147483648 = 0x 80000000

**
*/

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  unsigned long a=0;
  int b=31;

  a= 1 << b;
  printf("1 << 31 = %ld = 0x %lx\n",a,a);
  a= 1U << b;
  printf("1U << 31 = %ld = 0x %lx\n",a,a);
  return(0);
}

------------

Regards,
Monty
MySQL Moderator


More information about the Gcc-bugs mailing list