[CBLX] Comment dois-je tester l'endianness en C ou C++?

[ Thread Index | Date Index | More lists.tuxfamily.org/carrefourblinux Archives ]


Bonjour tous,

J'espère ne pas être trop HS ici parce que je ne sais pas où poster ce genre de requête.

Je mets ma requête ici en désespoir de cause parce que pour faire mon test, j'ai compilé le bout de code qui suit sur un PC monté en Fedora 12 avec le GCC 4.4.3 embarqué dans la distrib.

Voici le code lui-même:

------ Début du code ------
/**
 *
 * This small programs tests and explains endianness.
 *
 */

/* --- The needed header files --- */
#include <stdio.h> /* for input and output */
#include <inttypes.h> /* special integer types */

/* --- Given definition --- */
#ifdef WIN32 /* windows-like OS assumed */
#define ATTRIBUTE
#else /* linux-like OS assumed */
#define ATTRIBUTE	__attribute__((packed))
#endif /* windows or linux */

/* --- The byte divided into 8 bit fields --- */
typedef struct _bitfields {
#if __BYTE_ORDER == __BIG_ENDIAN
	uint8_t b0:1;
	uint8_t b1:1;
	uint8_t b2:1;
	uint8_t b3:1;
	uint8_t b4:1;
	uint8_t b5:1;
	uint8_t b6:1;
	uint8_t b7:1;
#elif __BYTE_ORDER == __LITTLE_ENDIAN
	uint8_t b7:1;
	uint8_t b6:1;
	uint8_t b5:1;
	uint8_t b4:1;
	uint8_t b3:1;
	uint8_t b2:1;
	uint8_t b1:1;
	uint8_t b0:1;
#endif /* big or little endian */
} ATTRIBUTE bitfields;

/* --- main --- */
int main(void) {
	uint8_t val=0;
	bitfields* bf = (bitfields*)(&val);
#if __BYTE_ORDER == __BIG_ENDIAN
	printf("This machine works in big endian.\n");
#elif __BYTE_ORDER == __LITTLE_ENDIAN
	printf("This machine works in little endian.\n");
#endif /* big or little endian */
	printf("To understand how bits are ordered into a byte.\n");
	printf("Give a value : ");
	scanf("%hhu", &val);
	while ( val != 0 ) {
		uint8_t n = bf->b0&1;
		printf("Given value = %d.\n", val);
		printf("val=%d,",n);
		n = bf->b1&1; printf("%d,",n);
		n = bf->b2&1; printf("%d,",n);
		n = bf->b3&1; printf("%d,",n);
		n = bf->b4&1; printf("%d,",n);
		n = bf->b5&1; printf("%d,",n);
		n = bf->b6&1; printf("%d,",n);
		n = bf->b7&1; printf("%d from b0 to b7.\n",n);
		printf("Give another value : ");
		scanf("%hhu", &val);
	} /* at this time, value is 0 */

	printf("Finished.\n");
	return 0;
} /* main */
------ Fin du code ------

En réponse, quand je fais tourner le programme, j'obtiens ceci:

------ Début de la sortie ------
[delaunayc@rennxlxrda013 TestEndian]$ ./TestByteOrder
This machine works in big endian.
To understand how bits are ordered into a byte.
Give a value : 1
Given value = 1.
val=1,0,0,0,0,0,0,0 from b0 to b7.
Give another value : 2
Given value = 2.
val=0,1,0,0,0,0,0,0 from b0 to b7.
Give another value : 3
Given value = 3.
val=1,1,0,0,0,0,0,0 from b0 to b7.
Give another value : 4
Given value = 4.
val=0,0,1,0,0,0,0,0 from b0 to b7.
Give another value : 128
Given value = 128.
val=0,0,0,0,0,0,0,1 from b0 to b7.
Give another value : 130
Given value = 130.
val=0,1,0,0,0,0,0,1 from b0 to b7.
Give another value : 131
Given value = 131.
val=1,1,0,0,0,0,0,1 from b0 to b7.
Give another value : 0
Finished.
[delaunayc@rennxlxrda013 TestEndian]$
------ Fin de la sortie ------

C'est quand même bizarre: la machine est bien un PC, normalement équipé d'un processeur pentium. Si je ne me méprends pas, tous ces processeurs de type X86 sont censés fonctionner en little endian. Non?

D'ailleurs, en regardant la sortie de mon code, on s'aperçoit qu'effectivement, les bits d'un octet sont bien présentés poids faible d'abord. Alors, pourquoi mon code fait-il comme s'il devait travailler en big endian?

C'est sûrement mon test qui n'est pas bon mais comment dois-je m'y prendre alors SVP?

Merci infiniment. Bonne journée. @+ ChD

---
--
   CarrefourBLinuX MailingListe
   Pour obtenir de l'aide, envoyez le sujet  help  à:
   carrefourblinux-request@xxxxxxxxxxxxxxxxxxx
   Archives:
   http://listengine.tuxfamily.org/lists.tuxfamily.org/carrefourblinux


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/