This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
I have a bad day, output is not the same, in pointer to unsignedlong long int bits field.
- From: Fran <e_agf at yahoo dot es>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 14 Aug 2005 19:57:59 +0200
- Subject: I have a bad day, output is not the same, in pointer to unsignedlong long int bits field.
Today seems that I am stupid , but I can not find process difference
between
function raw_to_ull1 and raw_to_ull_11, if you can see the difference
this is not a bug.
/*
Output:
ull.bit_6 = *(raw + len - 2) = #
ull.bit_7 = *(raw + len - 1) = (
--->llu=8960
ull.bit_7 = *(raw + len - 1) = (
ull.bit_6 = *(raw + len - 2) = #
--->llu=9000
CFLAGS=-Wall -O3 -m32 -march=pentium3 -mcpu=pentium3 --ansi
> Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.3/specs
> Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
> Thread model: posix
> gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
*/
/* Fco. J. */
#include <stdlib.h>
#include <stdio.h>
typedef struct Ull
{
unsigned char bit_7:8;
unsigned char bit_6:8;
unsigned char bit_5:8;
unsigned char bit_4:8;
unsigned char bit_3:8;
unsigned char bit_2:8;
unsigned char bit_1:8;
unsigned char bit_0:8;
} Num;
unsigned char
raw_to_ull_1 (register unsigned char *raw, unsigned long long int
*number)
{
register struct Ull ull = { 0, 0, 0, 0, 0, 0, 0, 0 };
register unsigned char len;
unsigned long long int *u;
len = strlen (raw);
if ((len > 8) || (len == 0))
{
return (0);
};
u = (unsigned long long int *) &ull;
switch (len)
{
case 8:
printf ("ull.bit_0 = *(raw + len - 8) = %c\n", *(raw + len - 8));
ull.bit_0 = *(raw + len - 8);
case 7:
printf ("ull.bit_1 = *(raw + len - 7) = %c\n", *(raw + len - 7));
ull.bit_1 = *(raw + len - 7);
case 6:
printf ("ull.bit_2 = *(raw + len - 6) = %c\n", *(raw + len - 6));
ull.bit_2 = *(raw + len - 6);
case 5:
printf ("ull.bit_3 = *(raw + len - 5) = %c\n", *(raw + len - 5));
ull.bit_3 = *(raw + len - 5);
case 4:
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
case 3:
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
case 2:
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
case 1:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
*number = *u;
/* printf ("--> %u,%u,%u,%u,%u,%u,%u,%u --> %llu\n", ull.bit_7,
ull.bit_6, ull.bit_5, ull.bit_4, ull.bit_3, ull.bit_2, ull.bit_1,
ull.bit_0, *u);*/
return 1;
default:
return 0;
};
} unsigned char
raw_to_ull_11 (unsigned char *raw, unsigned long long int *number)
{
struct Ull ull = { 0, 0, 0, 0, 0, 0, 0, 0 };
register unsigned char len;
unsigned long long int *u;
len = strlen (raw);
if ((len > 8) || (len == 0))
{
return (0);
};
u = (unsigned long long int *) &ull;
switch (len)
{
case 1:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
*number = *u;
return 1;
case 2:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
*number = *u;
return 1;
case 3:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
*number = *u;
return 1;
case 4:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
*number = *u;
return 1;
case 5:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
printf ("ull.bit_3 = *(raw + len - 5) = %c\n", *(raw + len - 5));
ull.bit_3 = *(raw + len - 5);
*number = *u;
return 1;
case 6:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
printf ("ull.bit_3 = *(raw + len - 5) = %c\n", *(raw + len - 5));
ull.bit_3 = *(raw + len - 5);
printf ("ull.bit_2 = *(raw + len - 6) = %c\n", *(raw + len - 6));
ull.bit_2 = *(raw + len - 6);
*number = *u;
return 1;
case 7:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
printf ("ull.bit_3 = *(raw + len - 5) = %c\n", *(raw + len - 5));
ull.bit_3 = *(raw + len - 5);
printf ("ull.bit_2 = *(raw + len - 6) = %c\n", *(raw + len - 6));
ull.bit_2 = *(raw + len - 6);
printf ("ull.bit_1 = *(raw + len - 7) = %c\n", *(raw + len - 7));
ull.bit_1 = *(raw + len - 7);
*number = *u;
return 1;
case 8:
printf ("ull.bit_7 = *(raw + len - 1) = %c\n", *(raw + len - 1));
ull.bit_7 = *(raw + len - 1);
printf ("ull.bit_6 = *(raw + len - 2) = %c\n", *(raw + len - 2));
ull.bit_6 = *(raw + len - 2);
printf ("ull.bit_5 = *(raw + len - 3) = %c\n", *(raw + len - 3));
ull.bit_5 = *(raw + len - 3);
printf ("ull.bit_4 = *(raw + len - 4) = %c\n", *(raw + len - 4));
ull.bit_4 = *(raw + len - 4);
printf ("ull.bit_3 = *(raw + len - 5) = %c\n", *(raw + len - 5));
ull.bit_3 = *(raw + len - 5);
printf ("ull.bit_2 = *(raw + len - 6) = %c\n", *(raw + len - 6));
ull.bit_2 = *(raw + len - 6);
printf ("ull.bit_1 = *(raw + len - 7) = %c\n", *(raw + len - 7));
ull.bit_1 = *(raw + len - 7);
printf ("ull.bit_0 = *(raw + len - 8) = %c\n", *(raw + len - 8));
ull.bit_0 = *(raw + len - 8);
*number = *u;
return 1;
default:
return 0;
};
}
int
main ()
{
unsigned long long int u;
register unsigned char cont;
unsigned char serial[40];
unsigned int contador;
sprintf (serial, "#(");
if (raw_to_ull_1 (serial, &u) == 0)
{
printf ("Error\n");
};
printf ("--->llu=%llu \n", u);
if (raw_to_ull_11 (serial, &u) == 0)
{
printf ("Error\n");
};
printf ("--->llu=%llu \n", u);
}