Ordine dei byte: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica  | 
				 LiveRC : Annullate le modifiche di 138.41.2.252 (discussione), riportata alla versione precedente di RobyReal12 Etichetta: Annulla  | 
				||
| (48 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]],  
== 
La ''endianness'' (ordine dei byte) di un computer dipende essenzialmente dall'architettura hardware usata. Ad esempio, [[Intel]] e [[Digital]] usano il formato little 
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.▼ 
==  
▲I termini big-endian e little-endian derivano 
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]]).▼ 
==  
▲Questa differenziazione non riguarda né la posizione dei [[Bit (informatica)|bit]] all'interno del byte,  
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  
▲* ''big-endian'': memorizzazione/trasmissione che inizia dal  
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. 
▲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]] 
==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  
       Little 
        +----+----+              +----+----+ 
        |0x23| 
        +----+----+              +----+----+ 
  byte:    0    1                   0    1 
Riga 35 ⟶ 33: 
Nel caso di una DWORD (32 bit), il numero [[esadecimale]] 0x01234567 verrà immagazzinato come: 
            Little 
        +----+----+----+----+    +----+----+----+----+ 
        |0x67|0x45|0x23| 
        +----+----+----+----+    +----+----+----+----+ 
  byte:    0    1    2    3         0    1    2    3 
Riga 44 ⟶ 42: 
==Funzioni per la conversione== 
Le seguenti [[Funzione (informatica)|funzioni 
=== 
====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#=== 
=== 
<syntaxhighlight lang="c#"> 
 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){ 
 | ((value << 24) & 0x0000FF00000000) | ((value << 40) & 0x00FF0000000000) | ((value << 56) & 0xFF000000000000); 
 } 
</syntaxhighlight> 
=== Implementazione in C++ === 
Da C++23 è disponibile [https://en.cppreference.com/w/cpp/numeric/byteswap std::byteswap].  
▲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}} 
 | |||