[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux-team] programme en C :probleme de byte-order



"Pascal A. Dupuis" wrote:
> 
> Salut,
> 
> voici un bout de programme C :
> #include <stdio.h>
> #include <stdlib.h>
> 
> int main(int argc, char **argv)
> {
>   unsigned char x[4], *c;
>   char *tail;
>   int i = 1, j;
>   unsigned int y;
> 
>   if (*(char *)&i == 1)
>     printf("little endian\n");
>   else
>     printf("big endian\n");
> 
>   if (argc > 1)
>     for (i = 1; i < argc; i++)
>       {
>         printf("Scanning arg %d : %s \n", i, argv[i]);
>         y = strtoul(argv[i], &tail, 0);
>         c = (unsigned char *)&y;
>           for (j = 0; j < 4; j++)
>             x[j] = *c++;
>         printf("value of y %d\n", y);
>         printf("internal: x0 0x%x x1 0x%x x2 0x%x x3 0x%x\n",
>                x[0], x[1], x[2], x[3] );
>       }
>   return 0;
> }
> 
> Le premier block "if" vient de la FAQ de comp.lang.c.moderated et affiche
> comme résultat : little endian.

OK. c'est donc little endian.

> Le reste du
> code tends à montrer que, sur i386, la partie la plus significative de y
> est stockée à l'adresse la plus elevée (x[3]) : big endian ?

Non, c'est tjs little endian pcq en little endian  les octets
sont ranges en commencant (adresse la plus petite) par l'octet de poids le plus faible.
Donc la partie la plus significative de y se trouve a la plus haute adresse.

Extrait d'une mailing list:
	> Qu'est-ce que c'est Big endian et little endian ? Un western ?

	Pas vraiment :-)
	C'est l'ordre dans lequel les octets sont rangés en mémoire.
	Big Endian (BE) => poids fort en tête,
	Little Endian (LE) => poids faible en tête.

	Un exemple : soit le mot, de 32 bits, 0x12345678.
	Le rangement en mémoire BE est 0x12 0x34 0x56 0x78, alors
	que le rangement LE est 0x78 0x56 0x34 0x12.

	L'intérêt du BE est que l'ordre naturel est respecté.
	L'intérêt du LE est que l'adresse est la même quelquesoit
	le format de lecture (octet, demi-mot ou mot)

	Historiquement, Intel est LE alors que Motorola est BE.
 
> Plateforme: gcc-2.7.2.3, i486-pc-linux-gnu. Cette machine est-elle bien
> big endian ? Le premier block "if" est-il faux, ou ai-je raté un détail ?
> 
> Merci
> 
> Pascal Dupuis
> 

Ludovic Kuty.
---------
This message was sent by Majordomo 1.94.3. Please repport problems to
manu@rtfm.be. If you want to be deleted from the list, send a mail to
majordomo@rtfm.be with "unsubscribe linux-team" in the body.