Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

big/little endian

91 réponses
Avatar
David ROMAN
Est-il possible avoir un code en C capable de detecter le type de
processeur, en de lui forcer l'ecriture ou la lecture d'un fichier
binnaire en little ou big endian indifferement ???


Merci
David

10 réponses

Avatar
Anthony Fleury
Bonjour,

Jean-Marc Bourguet wrote:

David ROMAN writes:

Est-il possible avoir un code en C capable de detecter le type de
processeur,
Toute valeur peut etre relue comme un tableau d'unsigned char.

Donc
void hexdump(void* p, size_t n, FILE* fp) {
int i;
unsigned char* cp = p;
for (i = 0; i < n; ++i, ++cp) {
fprintf(fp, "%2x", *cp);
}
}
est valide.


Une petite question qui va sembler sûrement idiote, que devient ce type de
code pour des architectures ayant des byte de plus de 8 bits ? est-ce la
bonne manière de faire dans tous les cas ?

En fait je dois avouer que ce type d'architecture «défie» un peu mon
imagination, pour la simple et bonne raison que je n'ai jamais travaillé
dessus, je devrais peut être me remettre à l'architecture et me documenter
un peu :-)

Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra


Avatar
Jean-Marc Bourguet
Anthony Fleury writes:

Bonjour,

Jean-Marc Bourguet wrote:

David ROMAN writes:

Est-il possible avoir un code en C capable de detecter le type de
processeur,
Toute valeur peut etre relue comme un tableau d'unsigned char.

Donc
void hexdump(void* p, size_t n, FILE* fp) {
int i;
unsigned char* cp = p;
for (i = 0; i < n; ++i, ++cp) {
fprintf(fp, "%2x", *cp);
}
}
est valide.


Une petite question qui va sembler sûrement idiote, que devient ce
type de code pour des architectures ayant des byte de plus de 8
bits? est-ce la bonne manière de faire dans tous les cas ?


Le seul probleme est le "%2x", le 2 est alors insuffisant.

Les architectures de ce type recentes ont tendance (en fait je ne
connais pas d'exception mais mon savoir n'est pas universel) a
utiliser en C un char qui a la taille de l'unite d'addressage.

Les architectures de ce type plus anciennes ont generalement un char
plus petit que l'unite d'adressage. Et dans celles que je connais on
aurait plutot tendance a utiliser un char de 7 ou 6 bits qu'un de 8
bits ou plus quoi qu'en dise la norme. (C'est bien beau de demander
des char de 8 bits ou plus, si tout le reste utilise de char de 7 bits
l'interroperabilite n'est pas a son mieux).

En fait je dois avouer que ce type d'architecture «défie» un peu mon
imagination, pour la simple et bonne raison que je n'ai jamais
travaillé dessus, je devrais peut être me remettre à l'architecture
et me documenter un peu :-)


Pour ce qui concerne les architectures anciennes, il y a pas mal de
documentation disponible sur le PDP-10 (commence par 36bit.org et suis
le lien pour DEC). Pour les architectures recentes, regarde les DSP de
chez TI. Il doit y avoir de la doc.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Pierre Maurette
Yves ROMAN a écrit:


Emmanuel Delahaye a écrit:

Yves ROMAN wrote on 22/10/04 :

Désolé, mais je n'arrive jamais à me souvenir du sens de big/little endian.
Alors je parle en opposition Intel/Motorola...


Bienvenu au club! Si quelqu'un a un moyen mnémotechnique, qu'il le
dise!
Intel / Little, il me semble que les lettres en commun sont

suffisantes.
Ensuite, ce n'est pas un "truc", mais on peut soit mémoriser "little
end first, c.à.d. que les poids faibles sont écrits en premier. Mais
bien sûr, pourquoi first et pas last? En fait, j'ai lu que le
mnémonitechnique US est "Little[Big] End In", mais la subtilité de ce
"In" m'échappe.


Si la donnée à ranger en mémoire est comme une carte perforée a mettre dans la
fente, tu mets le bon coté dedans, et tu pousses !
C'est tiré par les cheveux (et un peu osé !) mais pourquoi pas...
Hum hum. Je vais en rester à mes "repères". Ces histoires de bits que

l'on met dedans avant de pousser, ça sent le dérapage à plein nez ...
--
Pierre




Avatar
Emmanuel Delahaye
Anthony Fleury wrote on 22/10/04 :
Une petite question qui va sembler sûrement idiote, que devient ce type de
code pour des architectures ayant des byte de plus de 8 bits ? est-ce la
bonne manière de faire dans tous les cas ?

En fait je dois avouer que ce type d'architecture «défie» un peu mon
imagination, pour la simple et bonne raison que je n'ai jamais travaillé
dessus, je devrais peut être me remettre à l'architecture et me documenter
un peu :-)


C'est pas pire qu'un architecture avec des int qui font 32 bits au lieu
des 16 requis. Les 16 bits de poids forts ne doivent pas être utilisés
si on veut écrire du code portable. C'est tout.

Le C, c'est simple :

8 bits -> char
16 bits -> int ou short
32 bits -> long
[C99]
64 bits -> long long

le reste c'est du pipeau.

Celui qui utilise une int pour des grandeurs 32 bits ou un char pour
des grandeurs 16 bits doit être fusillé tout les matins pendant une
semaine avec des balles rouillées.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
Jean-Marc Bourguet wrote on 22/10/04 :
Une petite question qui va sembler sûrement idiote, que devient ce
type de code pour des architectures ayant des byte de plus de 8
bits? est-ce la bonne manière de faire dans tous les cas ?


Les architectures de ce type recentes ont tendance (en fait je ne
connais pas d'exception mais mon savoir n'est pas universel) a
utiliser en C un char qui a la taille de l'unite d'addressage.


C'est la norme.

Les architectures de ce type plus anciennes ont generalement un char
plus petit que l'unite d'adressage.


Alors on ne parle pas de C standard. En C, un char et un byte ont la
même taille, et valent 1 (byte). Toujours. Leur taille en bit est au
minimum de 8 bits.

Et dans celles que je connais on
aurait plutot tendance a utiliser un char de 7 ou 6 bits qu'un de 8
bits ou plus quoi qu'en dise la norme. (C'est bien beau de demander
des char de 8 bits ou plus, si tout le reste utilise de char de 7 bits
l'interroperabilite n'est pas a son mieux).


Pas de char de 7 bits en C standard.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Jean-Marc Bourguet
Emmanuel Delahaye writes:

Jean-Marc Bourguet wrote on 22/10/04 :
Une petite question qui va sembler sûrement idiote, que devient ce
type de code pour des architectures ayant des byte de plus de 8
bits? est-ce la bonne manière de faire dans tous les cas ?


Les architectures de ce type recentes ont tendance (en fait je ne
connais pas d'exception mais mon savoir n'est pas universel) a
utiliser en C un char qui a la taille de l'unite d'addressage.


C'est la norme.


Non. On peut tres bien avoir un char* qui correspond a

struct {
unsigned* p; /* word */
int i; /* char in word */
}

et generer le code qu'il faut.

Les architectures de ce type plus anciennes ont generalement un
char plus petit que l'unite d'adressage.


Alors on ne parle pas de C standard. En C, un char et un byte ont la
même taille, et valent 1 (byte). Toujours. Leur taille en bit est au
minimum de 8 bits.


Pour du C standard sur une machine 36 bits, on utilise des char 9
bits.

Et dans celles que je connais on aurait plutot tendance a utiliser
un char de 7 ou 6 bits qu'un de 8 bits ou plus quoi qu'en dise la
norme. (C'est bien beau de demander des char de 8 bits ou plus,
si tout le reste utilise de char de 7 bits l'interroperabilite
n'est pas a son mieux).


Pas de char de 7 bits en C standard.


Ai-je dit le contraire?

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Anthony Fleury
Jean-Marc Bourguet wrote:

[...]
Pour ce qui concerne les architectures anciennes, il y a pas mal de
documentation disponible sur le PDP-10 (commence par 36bit.org et suis
le lien pour DEC). Pour les architectures recentes, regarde les DSP de
chez TI. Il doit y avoir de la doc.

Merci pour la réponse et pour les liens. Moi qui ne savait pas comment

occuper la semaine offerte par l'éducation nationale j'ai trouvé :-)

Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra

Avatar
James Kanze
Emmanuel Delahaye writes:

|> Jean-Marc Bourguet wrote on 22/10/04 :
|> > Non. Ce probleme devrait etre regle en ecrivant du code
|> > independant de la boutitude. C'est quand meme pas complique.

|> Tu veux dire en faisant des transferts 100% texte?

Pas forcement, bien que quand on a le choix, c'est sûrement la meilleur
solution.

|> Ca va pas être facile pour les fichier mp3, divx etc.

Mais je parie qu'ils ont un format défini pour les entiers, et qu'il
faut le respecter. Là aussi, je ne vois pas ce que le boutitude de la
machine a à voir là dedans.

|> Non. Il est nécessaire d'avoir des fonctions portables ntoh/hton qui
|> font l'abstraction en fonction de la cible, ou mieux, un protocoile
|> de type XDR de façon à ce que les interface externes soient
|> compatibles.

Pas du tout. J'ai écrit pour pas mal de formats binaires définis en
dehors du projet, et je ne me suis jamais servi de ces fonctions-là.

En fait, qu'est-ce que tu fais si l'ordre qu'ils imposent n'est pas le
bon ?

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
Emmanuel Delahaye writes:

|> Jean-Marc Bourguet wrote on 22/10/04 :
|> >> Une petite question qui va sembler sûrement idiote, que devient
|> >> ce type de code pour des architectures ayant des byte de plus de
|> >> 8 bits? est-ce la bonne manière de faire dans tous les cas ?

|> > Les architectures de ce type recentes ont tendance (en fait je ne
|> > connais pas d'exception mais mon savoir n'est pas universel) a
|> > utiliser en C un char qui a la taille de l'unite d'addressage.

|> C'est la norme.

La norme spécifie le comportement d'un programme écrit en C. Elle ne dit
rien sur l'architecture hardware sur laquelle il tourne. En fait, la
norme se penche en arrière pour rendre des implémentations conformes et
performantes possibles sur prèsque n'importe quelle architecture.

|> > Les architectures de ce type plus anciennes ont generalement un
|> > char plus petit que l'unite d'adressage.

|> Alors on ne parle pas de C standard. En C, un char et un byte ont la
|> même taille, et valent 1 (byte). Toujours. Leur taille en bit est au
|> minimum de 8 bits.

Et alors ? Quel rapport avec ce qu'à dit Jean-Marc ?

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
Emmanuel Delahaye writes:

|> Anthony Fleury wrote on 22/10/04 :

|> > Une petite question qui va sembler sûrement idiote, que devient ce
|> > type de code pour des architectures ayant des byte de plus de 8
|> > bits ? est-ce la bonne manière de faire dans tous les cas ?

|> > En fait je dois avouer que ce type d'architecture «défie» un peu
|> > mon imagination, pour la simple et bonne raison que je n'ai jamais
|> > travaillé dessus, je devrais peut être me remettre à
|> > l'architecture et me documenter un peu :-)

|> C'est pas pire qu'un architecture avec des int qui font 32 bits au
|> lieu des 16 requis. Les 16 bits de poids forts ne doivent pas être
|> utilisés si on veut écrire du code portable.

Portable à quoi. Mes applications ont besoin de plusieurs Mo de données,
du support pour les threads Posix, de l'écriture synchronisée, des
sockets, et que sais-je de plus. Je sais à peu près les machines sur
lesquelles elles pourraient tourner, et il n'y a pas une seule qui a des
int moins de 32 bits. Mes applications sont portables, mais la
portabilité a bien ses limites. Elles ne tourneront jamais sur le
processeur one-chip avec 128 octets de mémoire vive.

|> C'est tout.

|> Le C, c'est simple :

|> 8 bits -> char
|> 16 bits -> int ou short
|> 32 bits -> long
|> [C99]
|> 64 bits -> long long

|> le reste c'est du pipeau.

Y compris les threads, les sockets, les processus, un stack qui permet
plus d'un niveau d'appel, un malloc qui permet plus de 100 octets total
d'alloué...

J'ai déjà travaillé sur un processeur embarqué avec pour tout 64 octets
de mémoire vive. J'ai aussi travaillé sur des systèmes serveurs des
bases de données de taille rélativement grandes. Il n'y aura jamais
aucun programme qui fonctionnera sur les deux. La portabilité a toujours
ses limites.

L'important, évidemment, c'est de se rendre compte, et de ne pas
introduire des limitations artificielles dans le code parce qu'on a
assumé des choses qui ne sont pas universelles. Mais quelqu'un qui écrit
du code pour Unix ou pour Windows aujourd'hui peut assumer au moins 32
bits dans un int, sans trop de risque.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34