Stavo imparando a programmare per un robot con ostacoli vuoti ma quando ho guardato il codice Ho visto due tipi di dati long e int.
Int sono tipi di dati che contengono da -2.147.483.648 a 2.147.483.647. Long sono anche tipi di dati che contengono da -2.147.483.648 a 2.147.483.647.
Int e long sono uguali, ma ho trovato il codice in cui vengono utilizzati due tipi di dati come mostrato di seguito:
int trigPin = 2; int echoPin = 4; long duration, cm, inches;
Ma come puoi sapere quando utilizzare quale tipo di dati? Ho cercato molto nel Web ma non capivo, quindi qualcuno può spiegarmelo per favore.
Commenti
- " Int sono tipi di dati che contengono da -2.147.483.648 a 2.147.483.647 " Dove lhai sentito?
Risposta
Su Arduino (modelli AVR) un int
è di 16 bit, non di 32 bit. Quindi va da -32768 a +32767.
Questo è diverso da long
che è di 32 bit.
Commenti
- Quali sono le larghezze di
int
elong
sugli Arduino ARM a 32 bit come Due? - Penso che sul Due che un
int
è di 32 bit, lo stesso along
. Vedi qui per esempio.
Risposta
int
in AVR GCC è 16 bit , non 32.
Risposta
Secondo la specifica del linguaggio C , int
deve contenere almeno 16 bit e long
deve essere almeno 32 bit o più.
Va bene per un compilatore implementare int
come 32 bit o addirittura 64 bit. Va bene per un compilatore implementare long
come 64 bit o più. Ma non è consentito a un compilatore implementare long
come 16 bit.
Quindi quando usare quale tipo?
Se i valori con cui lavorerai può essere rappresentato entro 16 bit, allora va bene usare int
. Se hai bisogno di più di 16 bit, usa long
. Se hai bisogno di più di 32 bit usa long long
.
Non farti prendere dalle specifiche del compilatore e / o della CPU. Come menzionato da altri, anche allinterno nella stessa gamma di prodotti, Arduino, sono disponibili CPU a 16 e 32 bit. Invece, fidati solo di ciò che lo standard garantisce.
Le specifiche complete dei tipi in C sono:
-
char
deve essere di almeno 8 bit -
int
deve essere di almeno 16 bit -
long
deve essere di almeno 32 bit -
long long
deve essere di almeno 64 bit
Nota: è perfettamente legale per i compilatori implementare char, int, long e long long come 64 bit. Questo in effetti non è raro tra i DSP.
Commenti
- Inoltre: leggi la documentazione del compilatore
- E:
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
secondo lo standard. Quindi, seint
è di 64 bit, anchelong
deve contenere almeno 64 bit.
Risposta
È lo stesso ragionamento di C: è prevista la dimensione del tipo int
essere la dimensione naturale della parola che il sistema gestisce in modo più efficiente . Deve anche essere larga almeno 16 bit, non inferiore a short
e non più grande di un long
.
Quindi un int
può essere basato su 16, 32 o 64 bit su qualunque cosa il tuo sistema gestisce meglio, quindi è molto probabile che sia largo 16 bit su una CPU a 8 o 16 bit, 32 su una CPU a 32 bit ecc.
Io uso int
quando voglio le migliori prestazioni, facendo attenzione a proteggermi quando ho bisogno di un intervallo maggiore di quello offerto da 16 bit. Oggigiorno, tendi a sapere quando stai scrivendo codice dellapplicazione per sistemi a 16 bit, sebbene questo non sia così vero per il codice “libreria” in cui la portabilità può essere di maggiore preoccupazione.
Nel tuo esempio, supponendo che lautore abbia scelto con cura i loro tipi, le variabili int
probabilmente richiedono un piccolo intervallo e potrebbero permettersi di avere dimensioni di parola , portando a codice potenzialmente più breve o più veloce (o entrambi). I long
presumibilmente richiedevano un intervallo superiore a 16 bit (è garantito che siano larghi almeno 32 bit). Sul processore che hai “selezionato come destinazione della compilazione, sembra che int
e long
siano stati entrambi implementati a 32 bit; questo sarebbe essere diverso (o dovrebbe essere) se hai selezionato una CPU di destinazione a 16 bit.
Risposta
Mi piace usare i tipi da stdint.h
.
Anche se hanno piccoli inconvenienti, il vantaggio che forniscono è che sai esattamente le dimensioni che stai gestendo, anche quando compili su altre architetture.
#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc.
Ma ovviamente non vuoi muoverti attorno a un mucchio di int32_t quando i tuoi dati hanno bisogno solo di int16_t.
Commenti
- Quindi non usare la parola macchina la dimensione non influisce sulle prestazioni su AVR?
- @Ren é – Generalmente non utilizzare la dimensione della parola può influire sulle prestazioni sulla maggior parte delle CPU. Ma tradizionalmente le CPU AVR hanno registri a 8 bit & accumulatori con alcune istruzioni a 16 bit per le operazioni del puntatore. Quindi, quando programma, ottengo prima il codice in esecuzione, quindi ottimizzo per la velocità se ' è troppo lento.
- @Ren é – Ma se vuoi davvero essere pedante, potresti usare
word
come tipo di dati. Si tratta di 16 bit su Arduino Uno e 32 bit su Arduino Due & Zero. Ma questo torna al problema di conoscere solo la dimensione minima del tuo tipo di dati. Supponi di utilizzareword
su un codice Due, ma poi vuoi eseguire il back-port su Uno ?! Luso di uint32_t invece risolverebbe questo problema prima che inizi, ma sì, su Uno non sarà ottimale per le dimensioni delle parole. E le future schede Arduino … che dimensione avranno le parole? 32? 64? 128 !? - OK. Quindi userei la dimensione della parola macchina (int? WORD sembra essere una definizione di tipo di Windows obsoleta) se il limite inferiore è sufficiente, non mi interessa la dimensione della memoria e ho bisogno della velocità, * _t se mi interessa la dimensione?
- scrap that … gnu.org/software/libc/manual/html_node/Integers.html dice
*fast*_t
sembra essere la strada da percorrere …