Domanda

Ho provato questo

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

la stampa ricorda:
89
0
0
0

che si allena abbastanza il mio stomache perchè ho pensato che il numero sarebbe salvato nella memoria come 0x00000059 così come mai c [0] è 89? ho pensato che si suppone che sia in c [3] ...

È stato utile?

Soluzione

Dato che il processore è in esecuzione su è little-endian . L'ordine dei byte, di un tipo fondamentale multi-byte, viene scambiato. Su una macchina big-endian che sarebbe stato come ci si aspetta.

Altri suggerimenti

Questo è perché si sta eseguendo il programma su un little endian cpu. Vedi anche endianness qui e ci .

Endian-ness è ovviamente la risposta come Goz ha sottolineato.

Ma per coloro che non sono chiare su cosa significa, è anche importante capire che l'ordine dei byte visualizzati nell'esempio è lo stesso che l'ordine nella int originale. Memcpy non cambia l'ordine dei byte, indipendentemente dal tipo Edian della piattaforma.

Perché l'ordine dei byte è una decisione arbitraria di progettazione. Una volta in un registro, non esiste un ordine di byte 1 .

comando Byte sorge quando affronteremo unità più piccole come byte. Si tratta di una decisione sostanzialmente arbitrario il progettista CPU arriva a fare:. Big-endian o little-endian

E 'utile per semplificare la situazione e rendersi conto che è soprattutto la connessione a periferiche che viene ordinato di byte. Sì, può essere scoperto attraverso byte di indirizzamento come avete dimostrato, ma in valori scalari generali vengono caricati e memorizzati come unità, nei registri, e in questo caso l'ordine dei byte non cambia nulla. I bit più significativi sono "a sinistra", per lo meno, il modo in cui siamo abituati a scrivere i numeri. Ed è per questo che gli operatori << e >> producono sempre gli stessi risultati esatti su big-endian vs macchine little-endian se utilizzato secondo le norme della lingua.

Ma per leggere e scrivere i flussi di dati a dispositivi periferici, si è costretti a scegliere un ordine dei byte. Questo perché le periferiche sono fondamentalmente dispositivi di flusso di byte. Ha l'indirizzo più basso hanno i bit più significativi o di meno? E 'fatto in entrambe le direzioni ed i campi utilizzati per essere piuttosto equamente diviso.

A causa di memoria stessa è indirizzata byte, è certamente possibile derivare un comportamento diverso senza una periferica, ma questo in genere non avviene senza una sbirciatina deliberata dentro come hai fatto tu.

Immaginiamo una CPU che non ha solo byte, parole di 32 bit, indirizzato come 0, 1, 2. Il compilatore C rende char, int, e tutti gli oggetti lunghi 32 bit. (Questo è consentito dalla CX9.) Wow, nessun problema di ordine di byte! E 'entrambe le cose! Ma .. cosa succede quando ci colleghiamo il nostro primo periferico ??


1. Beh, x86 ha registri che registri alias più piccole, ma questa è un'altra storia.

Diverse macchine possono avere diverso ordinamento di byte, ma dare un'occhiata a questo codice e pensare a ciò che accade, a seconda di come i byte vengono laied out:

long x = 89;
short *p = (short*)&x;
short y = *p;

Se si desidera che l'applicazione per essere portatile o sviluppato all'interno di un team, probabilmente non si vuole seguire questa logica in quanto causerebbe difficile da catturare insetti e prolungare lo sviluppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top