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