Ordine dei byte: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Folto82 (discussione | contributi)
Nessun oggetto della modifica
LiveRC : Annullate le modifiche di 138.41.2.252 (discussione), riportata alla versione precedente di RobyReal12
Etichetta: Annulla
 
(46 versioni intermedie di 30 utenti non mostrate)
Riga 1:
{{F|informatica|luglio 2023}}
L{{'}}'''ordine dei byte''' (conosciuto anche come '''big-endian''', '''little-endian''' o '''middle-endian''' a seconda dei metodi differenti), in [[informatica]], sonoindica modalità differenti usate dai [[Computer|calcolatori]] per immagazzinare inall'interno della [[memoria (informatica)|memoria]] [[dato|dati]] di dimensione superiore al [[byte]] (es. [[word]], [[dword]], [[qword]]).
 
== EtimologiaStoria ==
La ''endianness'' (ordine dei byte) di un computer dipende essenzialmente dall'architettura hardware usata. Ad esempio, [[Intel]] e [[Digital]] usano il formato little -endian mentre [[Motorola]], [[IBM]] e [[Sun Microsystems|Sun]] usano il formato big -endian. Il formato dei dati contenuti nelle intestazioni dei [[Protocollo di rete|protocolli di rete]] è anch'esso big -endian; altri esempi di uso di questi due diversi formati sono quello del bus [[Peripheral Component Interconnect|PCI]], che è little -endian, o quello del [[VMEbus|bus VME]] che è big -endian.
I termini big-endian e little-endian derivano, come racconta [[Jonathan Swift]] nel romanzo ''[[I viaggi di Gulliver]]'', dai nomi di due popolazioni che abitavano nelle favolose isole di [[Lilliput]] e [[Lilliput|Blefuscu]], che erano entrati in rivalità per il modo in cui aprivano le uova: rompendo la punta (a Lilliput, per editto dell'imperatore, il cui figlio una volta si tagliò aprendo un uovo dall'estremità più grande, fu ordinato di aprire le uova dall'estremità più corta: little endians) o il fondo (a Blefuscu, in cui si rifugiarono gli oppositori che volevano conservare la tradizione di rompere le uova dall'estremità più grande: big endians). A causa di questa differenza (e della sua legittimazione imperiale), era scoppiata tra le due isole una guerra sanguinosa.
 
== Storia e motivazioniEtimologia ==
I termini big-endian e little-endian derivano, come racconta [[Jonathan Swift]] nel romanzo ''[[I viaggi di Gulliver]]'', dai nomi di due popolazioni che abitavano nelle favolose isole di [[Lilliput]] e [[Lilliput|Blefuscu]], che nel romanzo ''[[I viaggi di Gulliver]]'' di [[Jonathan Swift]]. Queste erano entratientrate in rivalità per il modo in cui aprivano le uova: - rompendo la punta (o il fondo: a Lilliput, per editto dell'imperatore, il cui figlio una volta si tagliò aprendo un uovo dall'estremità più grande, fu ordinato di aprire le uova dall'estremità più corta:piccola (little endians); o il fondo (a Blefuscu, in cui si rifugiarono gli oppositori che volevano conservare la tradizione di rompere le uova dall'estremità più grande: (big endians). A causa di questa differenza (e della sua legittimazione imperiale), era scoppiata tra le due isole una guerra sanguinosa.
La ''endianness'' (ordine dei byte) di un computer dipende essenzialmente dall'architettura hardware usata. Ad esempio, [[Intel]] e [[Digital]] usano il formato little endian mentre [[Motorola]], [[IBM]] e [[Sun Microsystems|Sun]] usano il formato big endian. Il formato dei dati contenuti nelle intestazioni dei [[Protocollo di rete|protocolli di rete]] è anch'esso big endian; altri esempi di uso di questi due diversi formati sono quello del bus [[Peripheral Component Interconnect|PCI]], che è little endian, o quello del [[VMEbus|bus VME]] che è big endian.
 
== Descrizione ==
Questa differenziazione non riguarda né la posizione dei [[Bit (informatica)|bit]] all'interno del byte, (nel qual caso si parla di [[ordine dei bit]]), né le posizioni dei caratteri in una [[Stringa (informatica)|stringa]]. Ha invece importanza nell'interpretazione (o decodifica) delledi codifichestringhe multi-byte di stringhe di caratteri, (ad esempio: la codifica [[UTF-16]] dello standard [[unicode]]).
 
=== Classificazione ===
[[File:32bit-Endianess.svg|miniatura|Diagramma che mostra le differenze tra la notazione ''little-endian'' e quella ''big-endian''|500x500px]]
La differenza tra i due sistemi è data dall'ordine con il qualecui i byte costituenti il dato da immagazzinare vengono memorizzati o trasmessi:
 
* ''littlebig-endian'': memorizzazione/trasmissione che inizia dal byte menopiù significativo (estremità più grande) per finire col piùmeno significativo, è utilizzata dai processori [[IntelMotorola]];
* ''biglittle-endian'': memorizzazione/trasmissione che inizia dal [[Bitbyte piùmeno significativo|byte (estremità più significativo]]piccola) per finire col menopiù significativo, è utilizzata dai processori [[Motorola]] e nei protocolli usati in [[InternetIntel]];
 
Nota bene: il termine ''endian'' genera spesso confusione; per ricordare correttamente la differenza si rammenti che ''endian'' si riferisce alla estremità da cui il dato originale comincia a essere elaborato (scritto/letto su/da memoria o trasmesso/ricevuto su/da canale di comunicazione), non a quale estremità finisce per ultima in memoria o su canale di comunicazione.
L'ordine big-endian è stato scelto come ordine standard in molti protocolli utilizzati in [[Internet]], viene perciò anche chiamato ''network byte order''. Per contro viene chiamato ''host byte order'' l'ordine nativo dell'[[host]] in uso.
 
L'ordine big-endian è stato scelto come ordine standard in molti protocolli utilizzati in [[Internet]], viene perciò anche chiamato ''network byte order''. Per contro viene chiamato ''host byte order'' l'ordine nativo dell'[[host]] in uso.
=== Uso dei formati di data ===
I termini vengono alle volte usati anche per indicare il formato di data:
* gg/mm/aaaa: la data europea è little-endian
* aaaa/mm/gg: la data big-endian è usata in [[Giappone]] e in [[ISO 8601]]
* mm/gg/aaaa: la data usata in [[Stati Uniti d'America|U.S.A.]] è middle-endian
 
=== Esempi ===
Nel caso di una WORD (16 bit), il numero [[esadecimale]] 0x0123 verràviene immagazzinato come:
Little -endian Big -endian
+----+----+ +----+----+
|0x23|'''0x01'''| |'''0x01'''|0x23|
+----+----+ +----+----+
byte: 0 1 0 1
Riga 35 ⟶ 33:
Nel caso di una DWORD (32 bit), il numero [[esadecimale]] 0x01234567 verrà immagazzinato come:
Little -endian Big -endian
+----+----+----+----+ +----+----+----+----+
|0x67|0x45|0x23|'''0x01'''| |'''0x01'''|0x23|0x45|0x67|
+----+----+----+----+ +----+----+----+----+
byte: 0 1 2 3 0 1 2 3
Riga 44 ⟶ 42:
 
==Funzioni per la conversione==
Le seguenti [[Funzione (informatica)|funzioni]] in [[linguaggio C]] possono essere usate per convertire una word e una dword da little a big endian e viceversa (la conversione è perfettamente simmetrica).
 
===ConversioneImplementazione diin wordC===
====Conversione di word====
<syntaxhighlight lang="c">
unsigned short int Endian_Word_Conversion(unsigned short int word) {
return ((word>>8)&0x00FF) | ((word<<8)&0xFF00) ;
}
</syntaxhighlight>
 
====Conversione di double word====
<syntaxhighlight lang="c">
unsigned long int Endian_DWord_Conversion(unsigned long int dword) {
return ((dword>>24)&0x000000FF) | ((dword>>8)&0x0000FF00) | ((dword<<8)&0x00FF0000) | ((dword<<24)&0xFF000000);
}
</syntaxhighlight>
 
===Implementazione in C#===
===UInt16=UInt32====
<syntaxhighlight lang="c#">
public ushort Endian_UInt16_Conversion(ushort value){
return (ushort)(((value >> 8) & 0x00FF) | ((value << 8) & 0xFF00));
}
 
===UInt32===
public uint Endian_UInt32_Conversion(uint value){
return ((value >> 24) & 0x000000FF) | ((value >> 8) & 0x0000FF00) | ((value << 8) & 0x00FF0000) | ((value << 24) & 0xFF000000);
}
</syntaxhighlight>
 
====UInt64====
<syntaxhighlight lang="c#">
public ulong Endian_UInt64_Conversion(ulong value){
return ((value >> 56) & 0x00000000000000FF) | ((value >> 40) & 0x000000000000FF00) | ((value >> 24) & 0x0000000000FF0000) | ((value >> 8) & 0x00000000FF000000) | ((value << 8) & 0x000000FF00000000)
| ((value << 24) & 0x0000FF00000000) | ((value << 40) & 0x00FF0000000000) | ((value << 56) & 0xFF000000000000);
}
</syntaxhighlight>
 
=== Implementazione in C++ ===
==Note==
Da C++23 è disponibile [https://en.cppreference.com/w/cpp/numeric/byteswap std::byteswap].
<references />
 
=== Uso deiper i formati di data ===
I termini {{Senza fonte|vengono alle volte usati}} anche per indicare il formato di data:
* gg/mm/aaaa: la data europea è little-endian
* aaaa/mm/gg: la data big-endian è usata in [[Giappone]] e in [[ISO 8601]]
* mm/gg/aaaa: la data usata in [[Stati Uniti d'America|U.S.A.]] è middle-endian
 
== Voci correlate ==
Riga 82 ⟶ 90:
 
== Altri progetti ==
{{interprogetto|preposizione=sull'}}
 
{{portale|informatica}}