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
Jean-Marc Bourguet
James Kanze writes:

Que j'y pense, le VAX avait (et je suppose, a toujours)
des instructions pour lire n bits à partir d'une adresse
et un offset de bits. Dans la première version de compress
que j'ai vu, on s'en servait, moyennant un petit coup de
asm, pour insérer et extraire les bits dans le flux --
c'était nettement plus rapide que tout ce qu'on aurait pu
écrire en C.


Bizarrement (est-ce réellement bizarre?), bien que j'ai plus
utilisé les VAX que les PDP-10, j'ai un peu touché à
l'assembleur de ces derniers mais pas à celui des VAX (sauf
pour débugger une fois ou deux).

(C'est quoi le fu2 adapté? Les dinosaures?)

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
Jean-Marc Bourguet
James Kanze writes:

Jean-Marc Bourguet writes:

|> Il y a quelques processeurs (en fait seul le 8051 me vient a
|> l'esprit pour le moment) qui permette d'acceder aux bits
|> individuellement. Dans ces cas l'ordre peut avoir de l'importance.

Et le PDP-10 ?


J'aurais dû y penser. Mais avec le 8051 en tête (il permet
de faire des opérations directement sur des bits, c'est un
micro-controleur après tout) ses capacités à ce niveau sont
faibles -- simplement la lecture et l'écriture accompagnée
éventuellement d'une incrémentation du pointeur si j'ai
bonne mémoire.

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
James Kanze a écrit:
[...]
(En passant, j'espère que tu ne prends pas mal mes critiques.
Que nenni. Pas vu de critique.

Je réponds demain, il y a du grain à moudre, mais là j'ai du monde
autour des sarments ;-)
Quand même, fais attention à ton adresse (pas pointeur). Même si ça ne
rentre pas dans le format, "9, place Pierre Sémard" n'est pas "9 place
Sémard"...
http://etoilerouge.chez.tiscali.fr/docrevfra/pcf1.html
;-)
--
Pierre

Avatar
Jean-Marc Bourguet
James Kanze writes:

Jean-Marc Bourguet writes:

|> Pierre Maurette writes:

|> > Question aux spécialistes du C: est-il possible de
|> > concevoir une machine dont l'atome mémoire (donc la
|> > base de l'endianité) serait de 16 bits et la taille
|> > du char de 8 bits ?

|> Oui. On utilise alors des pointeurs vers char qui
|> contiennent plus d'info. C'est a cause de ce genre de
|> machines qu'on peut avoir sizeof (int*) <
|> sizeof(char*). Les C pour PDP-10 que j'ai vu (j'ai pas
|> utilise le C sur ces machines mais des compilateurs C
|> pour elles existent) ont CHAR_BIT==9 et
|> sizeof(int)==4; mais ces machines etaient utilise avec
|> de l'ASCII, 7 bits, 5 char par mot + 1 bit de padding
|> ou du 6 bits , 6 char par mots et il me semble me
|> souvenir qu'il etait possible de mettre les compilo C
|> dans un mode plus compatible avec le systeme meme si
|> moins conforme a l'ISO.

Sur le C pour le PDP-10 que j'ai vu, la taille des
pointeurs était toujours 24 bits. En revanche, il n'y
avait que les bits de poids faibles (j'en oublies combien)
qui servait pour l'adressage des mots ; certains bits de
poids fort servaient à selectionner les bytes dans le mot,
le cas échéant (les char*). Ce qui donnait la situation
que si p était un char*, "(int)p > (int)( p+1 )" pour
certains valeurs de p.


(Toujours de mémoire, donc sujet à erreur, et je répète que
je n'ai pas programmé cette machine en C, donc ça diminue
d'autant la qualité de mes souvenirs sur le C)

Le PDP-10 permettait l'adressage indirect dans toute sa
splendeur. Les champs définissant une adresse dans une
instruction était au nombre de 3: une valeur immédiate sur
18 bits, un registre (le registre 0 n'était pas disponible
pour ça, son utilisation marquait l'absence de
registre). L'adresse était la somme des deux. Le troisième
champs indiquait qu'en fait il fallait récupérer l'adresse
en mémoire à l'adresse juste calculée. L'adresse en mémoire
était dans le format des champs définissant les adresses
dans les instructions, avec la possibilité d'une nouvelle
indexation sur un registre et d'une nouvelle indirection...

Les instructions manipulant des chars devaient
nécessairement faire référence à un mot en mémoire. Une
partie (ou tous?) des bits autrement ignorés lors du calcul
d'adresse de celui-ci désignaient la taille du char et sa
position dans le mot.

Vous pensez que c'est compliqué? Je n'ai pas abordé le
sujet de l'adressage étendu (dont je n'ai que des vagues
souvenirs) permettant des adresses sur plus de 18 bits.

(Sur le PDP-10, grosso modo, le poids fort d'un mot était
ignoré dans la plupart des adressages. Dans le cas des
instructions load byte et store byte, en revanche, une
partie du poid fort spécifier l'offset du premier bit, et
une autre partie le nombre de bits concerné. En C,
évidemment, le nombre de bits concerné était toujours 9,
mais dans la plupart des autres langages, on utilisait 6.)


Je crois que ça dépendait aussi de l'OS. TOPS-20 (que j'ai
utilisé) c'était généralement ASCII 7 bits (5 char par mot
et un bit -- celui de poids faible si j'ai bonne mémoire --
ignoré). Mais à certains endroits il y avait du SIXBIT,
provenant probablement de TOPS-10.

Je suis quasiment certains d'avoir vu un compilo C avec un
switch permettant de choisir la taille des char entre au
moins 9, 7 et 6

|> Alternativement on peut naturellement les faire
|> fonctionner avec des chars equivalent au mot.

C'était quand même assez rare sur les machines à vocation générale.


Effectivement, "assez rare" comme dans "je n'en connais
pas".

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
Jean-Marc
"Jean-Marc Bourguet" a écrit dans le message de
news:
"Jean-Marc" writes:

"Richard Delorme" a écrit dans le message de
news:4179589d$0$15756$
Anthony Fleury wrote on 22/10/04 :



Personnellement je choisis la seconde option, car je préfère un
programme non portable qui marche sur ma machine qu'un programme
portable qui ne marche que sur des machines dont je ne dispose pas.



C'est une opinion défendable, tant que tu ne programmes
que pour toi. Evidemment, c'est inacceptable si ton
programme a ne serait ce qu'une chance sur un million de
sortir de ta machine.


Mais non. C'est une opinion défendable dans beaucoup de
contextes.


Ok, je ne suis pas d'un naturel contrariant :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Richard Delorme

Personnellement je choisis la seconde option, car je préfère un
programme non portable qui marche sur ma machine qu'un programme
portable qui ne marche que sur des machines dont je ne dispose pas.


C'est une opinion défendable, tant que tu ne programmes que pour toi.
Evidemment, c'est inacceptable si ton programme a ne serait ce qu'une
chance sur un million de sortir de ta machine.


Tu n'as pas compris le sens de mon exemple. En pratique, sur l'exemple
que j'avais pris, mon code "non portable" marchera sur les machines
capables de faire fonctionner le code portable, tandis que le code
portable ne fonctionnera pas, par manque de ressources, sur les machines
16 bits pour lesquels il a été rendu portable. Il est donc vain de
vouloir rendre un code portable à tout prix, car, en pratique, on réduit
certainement le nombre de machine où le programme peut réellement
fonctionner.

--
Richard


Avatar
Emmanuel Delahaye
Richard Delorme wrote on 22/10/04 :
Tu n'as pas compris le sens de mon exemple. En pratique, sur l'exemple que
j'avais pris, mon code "non portable" marchera sur les machines capables de
faire fonctionner le code portable, tandis que le code portable ne
fonctionnera pas, par manque de ressources, sur les machines 16 bits pour
lesquels il a été rendu portable. Il est donc vain de vouloir rendre un code
portable à tout prix, car, en pratique, on réduit certainement le nombre de
machine où le programme peut réellement fonctionner.


C'est la conséquence évidente de la portabilité. On réduit les
performances à plus petit dénominateur commun. Il y a des cas où ce
n'est pas une option.

--
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
Richard Delorme
Richard Delorme wrote on 22/10/04 :

Tu n'as pas compris le sens de mon exemple. En pratique, sur l'exemple
que j'avais pris, mon code "non portable" marchera sur les machines
capables de faire fonctionner le code portable, tandis que le code
portable ne fonctionnera pas, par manque de ressources, sur les
machines 16 bits pour lesquels il a été rendu portable. Il est donc
vain de vouloir rendre un code portable à tout prix, car, en pratique,
on réduit certainement le nombre de machine où le programme peut
réellement fonctionner.



C'est la conséquence évidente de la portabilité. On réduit les
performances à plus petit dénominateur commun. Il y a des cas où ce
n'est pas une option.


Et réciproquement, il y a des cas où les performances ne sont pas une
option.

--
Richard


Avatar
Stephane Legras-Decussy
Richard Delorme a écrit dans le message :
4179589d$0$15756$
Personnellement je choisis la seconde option, car je préfère un
programme non portable qui marche sur ma machine qu'un programme
portable qui ne marche que sur des machines dont je ne dispose pas.


c'est pas le probleme qu'un programme soit portable
ou pas, c'est le probleme de maitriser à fond
la portabilité de facon à séparer de façon sûre, les modules portables
de ceux non-portables...

donc on ne sert que des 16 premiers bit des int partout...
sauf quant c'est critique et là, on isole la fonction
qui va bien et on met un énorme /* !!! WARNING !!! */ ...

Avatar
James Kanze
gl writes:

|> James Kanze wrote:
|> > |> Est ce que je raconte des anneries ou ai je bien tout compris
|> > |> jusqu'a present ????

|> > Moi, j'avoue que je ne comprends pas trop. Un int, c'est un int.
|> > Ce n'est pas des octets. Quand je veux lire un int, je lis un int,
|> > et non une suite d'octets.

|> Et comment fais tu alors pour lire un int dans fichier ecrit par une
|> autre architecture ou pour relier en reseau deux architectures
|> differentes ou les int n'auront pas forcement la meme taille, le
|> meme boutisme, etc. ?

La même façon qu'on les écrit. La définition du format doit bien
spécifier comment les écrire. Par exemple, en disant que le premier
octet contient les 8 bits de poids fort, le deuxième les 8 bits qui
suivent, etc. En C, si j'ai un format qui dit que un entier consiste en
quatre octets (non bytes, mais bien octets), en format complément à
deux, avec les bits 31-24 dans le premier octet, 23-16 dans le deuxième,
etc., c'est exactement comme ça que je l'écris :

void
writeInt( FILE* dest, int value )
{
unsigned tmp = value ; // convertit en représentation
// complément à 2
fputc( (tmp >> 24) & 0xff, dest ) ;
fputc( (tmp >> 16) & 0xff, dest ) ;
fputc( (tmp >> 8) & 0xff, dest ) ;
fputc( (tmp ) & 0xff, dest ) ;
}

À la lecture, c'est un peu plus difficile, parce qu'il n'a pas de moyen
simple à convertir un unsigned en signé complément à deux ; grosso modo,
il faut en régarder la valeur, puis décider ci le résultat doit être
négatif ou non, puis affecter la bonne valeur positive, et
éventuellement le complémenter. En général, je suppose complément à
deux, et une conversion qui se contente de prendre les bits comme ils
sont, en me réservant le travail supplémentaire dans le cas où je dois
le porter sur quelque chose d'exotique plus tard.

Mais je ne vois pas ce que pourrait faire un « swapper les bytes » là
dedans.

--
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