public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* I have a bad day, output is not the same, in pointer to unsigned long long  int bits field.
@ 2005-08-14 17:59 Fran
  2005-08-15 11:51 ` Andrew Pinski
  0 siblings, 1 reply; 2+ messages in thread
From: Fran @ 2005-08-14 17:59 UTC (permalink / raw)
  To: gcc-bugs

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);
}


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: I have a bad day, output is not the same, in pointer to unsigned long long  int bits field.
  2005-08-14 17:59 I have a bad day, output is not the same, in pointer to unsigned long long int bits field Fran
@ 2005-08-15 11:51 ` Andrew Pinski
  0 siblings, 0 replies; 2+ messages in thread
From: Andrew Pinski @ 2005-08-15 11:51 UTC (permalink / raw)
  To: Fran; +Cc: gcc-bugs


On Aug 14, 2005, at 1:57 PM, Fran wrote:

>   u = (unsigned long long int *) &ull;
>

You are violating C aliasing rules.  Either use an union or 
-fno-strict-aliasing.

-- Pinski


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-08-15 11:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-08-14 17:59 I have a bad day, output is not the same, in pointer to unsigned long long int bits field Fran
2005-08-15 11:51 ` Andrew Pinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).