Ordine dei byte: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Protetto "Ordine dei byte": Reiterati vandalismi ([Modifica=Consentito solo agli utenti autoconvalidati] (scade il 17 nov 2017 alle 11:34 (UTC)) [Spostamento=Consentito solo agli utenti autoconvalidati] (scade il 17 nov 2017 alle...
LiveRC : Annullate le modifiche di 138.41.2.252 (discussione), riportata alla versione precedente di RobyReal12
Etichetta: Annulla
 
(50 versioni intermedie di 31 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]]).
 
==Etimologia Storia ==
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.
 
== CaratteristicheEtimologia ==
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.
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) delle codifiche multi-byte di stringhe di caratteri (ad esempio: la codifica [[UTF-16]] dello standard [[unicode]]).
 
== ClassificazioneDescrizione ==
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]]).
La differenza tra i due sistemi è data dall'ordine con il quale i byte costituenti il dato da immagazzinare vengono memorizzati:
 
=== Classificazione ===
* ''little-endian'': memorizzazione che inizia dal byte meno significativo per finire col più significativo, è utilizzata dai processori [[Intel]];
[[File:32bit-Endianess.svg|miniatura|Diagramma che mostra le differenze tra la notazione ''little-endian'' e quella ''big-endian''|500x500px]]
* ''big-endian'': memorizzazione che inizia dal [[Bit più significativo|byte più significativo]] per finire col meno significativo, è utilizzata dai processori [[Motorola]] e nei protocolli usati in [[Internet]];
La differenza tra i due sistemi è data dall'ordine con il qualecui i byte costituenti il dato da immagazzinare vengono memorizzati o trasmessi:
*''middle-endian'': ordine dei byte né crescente né decrescente (ad esempio 3412 o 2143).
 
* ''big-endian'': memorizzazione/trasmissione che inizia dal [[Bitbyte più significativo|byte (estremità più significativo]]grande) per finire col meno significativo, è utilizzata dai processori [[Motorola]] e nei protocolli usati in [[Internet]];
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.
* ''little-endian'': memorizzazione/trasmissione che inizia dal byte meno significativo (estremità più piccola) per finire col più significativo, è utilizzata dai processori [[Intel]];
 
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.
==Storia e motivazioni==
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.
 
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 36 ⟶ 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 45 ⟶ 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 83 ⟶ 90:
 
== Altri progetti ==
{{interprogetto|preposizione=sull'}}
 
{{portale|informatica}}