Differenza tra il tipo di dati int e long su Arduino

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 e long sugli Arduino ARM a 32 bit come Due?
  • Penso che sul Due che un int è di 32 bit, lo stesso a long. 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, se int è di 64 bit, anche long 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 utilizzare word 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 …

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *