[Bug c/13208] New: Wrong expression evaluation when using data type or cast "long long"

druegh at informatik dot tu-muenchen dot de gcc-bugzilla@gcc.gnu.org
Wed Nov 26 22:37:00 GMT 2003


In the example below, "y*x" is computed in a way where implicitly the type
"unsigned int" of "x" is used to calculate the result, so it is "4294967290"
although it should be "-6" since b is "signed long long". 

Explanatory I did add some additional lines to demonstrate the problem.

(In fact the program produces the same output on a "gcc version 3.2.3 20030422
(Gentoo Linux 1.4 3.2.3-r2, propolice)", but since I still have gcc 2.95.3 I
could only provide the compiler output for that version. The test with 3.2.3 was
done by someone on an IRC channel for me.)


--- Source Code -------------------------------------------------------------

#include <stdio.h>


int main(int argc,char ** argv) {
  long long b; short y=-1; unsigned int x=6;

  b =          y*x ;    printf("b=%lli, (int)b=%i\n",b,(int)b); printf("\n");
  b = (signed) y*x ;    printf("b=%lli, (int)b=%i\n",b,(int)b);
  b =  y*(signed)x ;    printf("b=%lli, (int)b=%i\n",b,(int)b);
  b = (signed)(y*x);    printf("b=%lli, (int)b=%i\n",b,(int)b); printf("\n");

  b = (long long)(y*x); printf("b=%lli, (int)b=%i\n",b,(int)b);
  b = (long long) y*x ; printf("b=%lli, (int)b=%i\n",b,(int)b);
  b =  y*(long long)x ; printf("b=%lli, (int)b=%i\n",b,(int)b);

  return(0);
}


--- Compiler Output (gcc 2.95.3) "gcc -v longlong.c -o longlong" ------------

Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.3/specs
gcc version 2.95.3 20010315 (SuSE)
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cpp0 -lang-c -v -D__GNUC__=2
-D__GNUC_MINOR__=95 -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__
-D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386)
-Amachine(i386) -Di386 -D__i386 -D__i386__ -Di486 -D__i486 -D__i486__ longlong.c
/tmp/ccMyz80O.i
GNU CPP version 2.95.3 20010315 (SuSE) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include
 /usr/include
End of search list.
The following default directories have been omitted from the search path:
 /usr/include/g++
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/../../../../i486-suse-linux/include
End of omitted list.
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cc1 /tmp/ccMyz80O.i -quiet -dumpbase
longlong.c -version -o /tmp/cccXDuWu.s
GNU C version 2.95.3 20010315 (SuSE) (i486-suse-linux) compiled by GNU C version
2.95.3 20010315 (SuSE).
 /usr/i486-suse-linux/bin/as -V -Qy -o /tmp/ccg0IjXc.o /tmp/cccXDuWu.s
GNU assembler version 2.11.92.0.10 (i486-suse-linux) using BFD version
2.11.92.0.10 20011021 (SuSE)
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/collect2 -m elf_i386 -dynamic-linker
/lib/ld-linux.so.2 -o longlong /usr/lib/crt1.o /usr/lib/crti.o
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtbegin.o
-L/usr/lib/gcc-lib/i486-suse-linux/2.95.3 -L/usr/i486-suse-linux/lib
/tmp/ccg0IjXc.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtend.o
/usr/lib/crtn.o

-- 
           Summary: Wrong expression evaluation when using data type or cast
                    "long long"
           Product: gcc
           Version: 3.2.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: druegh at informatik dot tu-muenchen dot de
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: 2.95.3


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13208



More information about the Gcc-bugs mailing list