Quando si utilizza C / C ++ su altre piattaforme, il int
tipo è in genere 4 byte (o potenzialmente più). Tuttavia, su Arduino, sono solo 2 byte.
Perché è diverso? Influisce sulle prestazioni se uso sempre il 4 byte long
?
Quando si utilizza C / C ++ su altre piattaforme, il int
tipo è in genere 4 byte (o potenzialmente più). Tuttavia, su Arduino, sono solo 2 byte.
Perché è diverso? Influisce sulle prestazioni se uso sempre il 4 byte long
?
Risposte:
L'ATmega328 utilizzato in molti Arduinos è un microcontrollore a 8 bit. Ciò significa che i registri sono 8 bit, il bus dati è 8 bit, le porte sono 8 bit. Ci sono alcuni aspetti minimi a 16 bit nel sistema (ad esempio uno dei timer), ma quasi tutto è a 8 bit.
Pertanto, la maggior parte delle operazioni gestisce 8 bit alla volta. Lavorare su qualsiasi cosa ad eccezione di 8 bit (ovvero numeri interi a 16 bit o 32 bit e numeri in virgola mobile) richiede ciò che potrebbe essenzialmente essere descritto come emulazione software, in cui il compilatore utilizza più istruzioni per lavorare su queste variabili più grandi.
8 bit è ovviamente adeguato per indirizzare una porta a 8 bit. È anche sufficiente gestire molti contatori di loop, valori di ritorno e caratteri ASCII. Non è davvero abbastanza quando si tratta di numeri. Un int con 8 bit con segno (int8_t) può rappresentare solo -128 -> +127. Unsigned (uint8_t) può rappresentare solo 0 -> 255.
Gli interi a 8 bit sono piuttosto limitanti. C / C ++ int deve rappresentare almeno -32.678 -> +32.767, quindi mappa a int16_t - la dimensione più piccola che lo farà. Questo offre un buon equilibrio tra portata ed efficienza. Ciò è particolarmente importante quando i principianti stanno imparando: l'overflow non è in realtà qualcosa che i non programmatori comprendono.
Tuttavia, ciò ha un impatto sulle prestazioni, poiché la maggior parte delle operazioni a 16 bit richiede almeno il doppio di un'operazione a 8 bit e utilizza il doppio del numero di registri. Questo può o meno fare la differenza per te.
Molti di noi passano ai tipi nativi come int8_t e uint8_t in quanto offrono un controllo molto maggiore.
int
è un 32 bit! arduino.cc/en/Reference/int
Un fatto importante sui linguaggi C e C ++ è che i rispettivi standard non definiscono la dimensione (in byte) dei tipi di numeri in virgola mobile e integrale.
Definiscono solo intervalli minimi e relazione tra questi intervalli, ad es
range(short) <= range(int) < range(long)
Quindi la dimensione di es. Di una int
dipende in genere da:
sizeof(short) == sizeof(int) == sizeof(long)
è possibile?
sizeof(short) < sizeof(long)
.
int
è 4 byte su Arduino Due. Ashort
sarà 2 byte su tutti gli Ardunios esistenti, ma sottolineo il consiglio degli altri di usareint16_t
ouint16_t
.