Dans l'union U2, len est déclaré en short au lieu de char, et du coup, "char command" est codé sur 2 octets. Mais pourquoi ???

Merci de votre aide.


Plateforme : WinXP, mingw32, g++

Compilation :
g++ -Wall -gstabs -o union.exe union.cpp && union


-----------------------------------------
Sortie du programme :
Union 1 :
01 02 00 01

Union 2 :
01 00 02 00 00 01

-----------------------------------------

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
 
#include <iostream>
#include <iomanip>
 
using namespace std;
 
/*
len : nbre d'octets dans data
*/
 
typedef union U1
{
	char _bytes[512];											// 512 octets
 
	struct
	{
		char command;							// 1 octet
		char len;							// 1 octet
		char data[512-sizeof(char)-sizeof(char)];		// 510 octets
	} dPkt;
 
} T1;
 
 
typedef union U2
{
	char _bytes[512];						// 512 octets
 
	struct
	{
		char command;						// normalement 1 octet
		short len;						    // 2 octet
		char data[512-sizeof(char)-sizeof(short)];	// 509 octets
	} dPkt;
 
} T2;
 
 
 
 
void affiche(const char *s,size_t n);
 
int main()
{
	short value=256;	// 256 = 0x0100 ; codage little-endian : 00 01
 
	T1 v1;
	v1.dPkt.command=1;
	v1.dPkt.len=2;
	memcpy(v1.dPkt.data,&value,sizeof(short));
	cout<<"Union 1 :\n";
	affiche(v1._bytes,4);	// 1 (command) + 1 (len) + 2 (value) = 4
 
	T2 v2;
	v2.dPkt.command=1;
	v2.dPkt.len=2;
	memcpy(v2.dPkt.data,&value,sizeof(short));
	cout<<"\nUnion 2 :\n";
	affiche(v2._bytes,6);	// 2 et pas 1! (command) + 2 (len) + 2 (value) = 6
 
	return 0;
}
 
 
 
void affiche(const char *s,size_t n)
{
	for(size_t i=0;i<n;i++)
		cout<<setfill('0')<<hex<<setw(2)<<(short)s[i]<<' ';
	cout<<endl;
}