Salut à toutes et à tous
Mon très cher compilateur me met aujourd'hui au défi:
Je voudrais créer une union capable de tenir tous types de valeurs numériques: 1, 2, 4 ou 8 bytes;
Rien de très compliqué jusque là, une simple union suffit:
Je voudrais ensuite pouvoir facilement additionner des "cvalue" de tous types... un byte avec un int, un short avec un long...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef union { int8_t b; int16_t s; int32_t i; int64_t l; } cvalue;
Seulement, sur mon architecture intel (little endian donc si je ne m'abuse... corrigez moi), c'est infaisable de cette manière:
Si je pouvais mettre ces valeurs en big endian et les additionner en mode big endian, ça résoudrait le souci... mais je ne pense pas que ce soit possible, ou même performant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 v1.b = 1; v2.l = 1; int64_t result = v1.l + v2.l; printf("Resultat: %li\n", result); // Résultat: 2686722
Donc si je comprends bien, mon problème, précisément, est le suivant:
Dans mon union, les membres sont alignés sur le début:
Du coup, l'addition foire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Une cvalue prend 8 bytes: | | | | | | | | | Un int8_t prend le premier byte, les autres sont sensé être à zero | 1| 0| 0| 0| 0| 0| 0| 0| Un int64_t prend tous les bytes | 0| 0| 0| 0| 0| 0| 0| 1|
Je pense actuellement à adapter mon union avec des structures pour mettre du padding, comme ça les variables sont alignées, mais... oui, vous le voyez vous mêmes, ce n'est pas très propre.
Quelqu'un aurait-il une meilleure idée ? Quelque chose qui fontionne aussi avec les soustractions, divisions et multiplications ?
Edit: oh, dernière petite question: y a-t-il un moyen de savoir lors de la compilation si on est en little ou big endian ? style une constante du précompilateur ?
Partager