Diferența dintre tipul de date int și long pe Arduino

Învățam să programez pentru un robot obstacol nul dar când m-am uitat la cod Am văzut două tipuri de date lungi și int.

Int sunt tipuri de date care conțin -2.147.483.648 până la 2.147.483.647. Long sunt, de asemenea, tipuri de date care conțin -2.147.483.648 până la 2.147.483.647.

Int și long sunt la fel, dar am venit cu codul în care sunt utilizate două tipuri de tipuri de date, așa cum se vede mai jos: „7c70f69706”>

Dar cum poți ști când să folosești ce tip de date? Am căutat mult pe web, dar nu am înțeles, așa că cineva îmi poate explica acest lucru, te rog.

Comentarii

  • ” Int sunt tipuri de date care conțin -2.147.483.648 până la 2.147.483.647 ” Unde ați auzit asta?

Răspuns

Pe Arduino (modele AVR) un int este de 16 biți, nu de 32 de biți. Astfel se trece de la -32768 la +32767.

Adică diferit de la long care este de 32 de biți.

Comentarii

  • Care sunt lățimile int și long pe Arduino-urile ARM pe 32 de biți, cum ar fi Due?
  • Cred că pe Due că un int are 32 de biți, același a long. Consultați aici de exemplu.

Răspuns

int în AVR GCC este 16 biți , nu 32.

Răspuns

Conform specificațiilor limbajului C , int trebuie să aibă cel puțin 16 biți sau mai mult și long trebuie să aibă cel puțin 32 de biți sau mai mult.

Este în regulă ca un compilator să implementeze int ca 32 de biți sau chiar 64 de biți. Este bine ca un compilator să implementeze long ca 64 de biți sau mai mult. Dar nu este permis ca un compilator să implementeze long ca 16 biți.

Deci, când trebuie să folosiți ce tip?

Dacă valorile cu care veți lucra poate fi reprezentat în 16 biți, atunci este bine să utilizați int. Dacă aveți nevoie de mai mult de 16 biți, utilizați long. Dacă aveți nevoie de mai mult de 32 de biți, utilizați long long.

Nu vă lăsați la curent cu datele despre compilator și / sau CPU. După cum au menționat alții, chiar și în aceeași gamă de produse, Arduinos, sunt disponibile procesoare de 16 și 32 biți. În schimb, aveți încredere doar în ceea ce garantează standardul.

Specificațiile complete ale tipurilor din C sunt:

  • char trebuie să aibă cel puțin 8 biți
  • int trebuie să aibă cel puțin 16 biți
  • long trebuie să aibă cel puțin 32 de biți
  • long long trebuie să aibă cel puțin 64 de biți

Notă: Este perfect legal pentru compilatoare să implementeze char, int, long și long long 64 de biți. De fapt, acest lucru nu este neobișnuit printre DSP-uri.

Comentarii

  • De asemenea: Citiți documentația compilatorului dvs.
  • Și: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) conform standardului. Deci, dacă int are 64 de biți, atunci long trebuie să fie, de asemenea, de cel puțin 64 de biți.

Răspuns

Este același raționament ca în C: dimensiunea tipului int să fie dimensiunea naturală a cuvântului pe care sistemul dvs. o gestionează cel mai eficient . De asemenea, trebuie să aibă o lățime de cel puțin 16 biți, nu mai mică decât un short și nu mai mare decât un long.

Deci un int poate avea 16, 32 sau 64 de biți, bazat pe în ceea ce se ocupă cel mai bine de sistemul dvs., deci este cel mai probabil să aibă o lățime de 16 biți pe un procesor de 8 sau 16 biți, 32 pe un procesor pe 32 de biți etc.

Folosesc int când vreau cea mai bună performanță, având în același timp grijă să protejez când am nevoie de mai multă gamă decât cea oferită de 16 biți. În aceste zile, aveți tendința de a ști când scrieți codul aplicației pentru sistemele pe 16 biți, deși acest lucru nu este atât de adevărat pentru codul „bibliotecă”, unde portabilitatea poate fi de îngrijorare mai mare.

În exemplul dvs., presupunând că autorul și-a ales tipurile cu atenție, variabilele int necesită probabil o gamă mică și își pot permite dimensiunea cuvântului , ducând la un cod potențial mai scurt sau mai rapid (sau ambele). Cele long presupun probabil că au nevoie de mai mult de 16 biți (au o lățime garantată de cel puțin 32 de biți). Pe procesorul pe care l-ați selectat ca țintă de compilare, se pare că int și long au fost ambele implementate ca pe 32 de biți; să fie diferit (sau ar trebui să fie) dacă ați selectat un procesor țintă pe 16 biți.

Răspuns

Îmi place să folosesc tipuri din stdint.h.

Deși au dezavantaje minore, avantajul pe care îl oferă este că știți exact dimensiunea pe care o gestionați, chiar și atunci când compilați pe alte arhitecturi.

#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. 

Dar, evident, nu doriți să vă deplasați într-o grămadă de int32_t atunci când datele dvs. au nevoie doar de int16_t.

Comentarii

  • Deci, nu folosiți cuvântul mașină dimensiunea nu are impact asupra performanței AVR?
  • @Ren é – În general, nu se folosește dimensiunea cuvântului poate afecta performanța majorității procesorelor. div id = „b7a8af7ac4”>

acumulatori cu câteva instrucțiuni de 16 biți pentru operațiile de pointer. Deci, când programez, primesc primul cod care rulează, apoi optimizez pentru viteză dacă este ‘ este prea lent.

  • @Ren é – Dar dacă vrei cu adevărat să fii pedant în legătură cu asta, ai putea folosi word ca tip de date. Acesta este de 16 biți pe Arduino Uno și 32 de biți pe Arduino Due & Zero. Dar acest lucru revine la problema cunoașterii cu adevărat a dimensiunii minime a tipului dvs. de date. Să presupunem că utilizați word pentru un anumit cod Due, dar apoi doriți să faceți back-port în Uno ?! Folosirea uint32_t ar rezolva această problemă înainte de a începe, dar da, va fi sub-optimă la dimensiunea cuvântului pe Uno. Ce zici de viitoarele plăci Arduino … ce dimensiune de cuvânt vor avea? 32? 64? 128 !?
  • OK. Deci aș folosi dimensiunea cuvântului mașină (int? WORD pare a fi o definiție de tip Windows învechită) dacă limita inferioară este suficientă, nu-mi pasă de dimensiunea memoriei și am nevoie de viteză, * _t dacă îmi pasă de dimensiune?
  • resturi care … gnu.org/software/libc/manual/html_node/Integers.html spune *fast*_t pare a fi calea de urmat …
  • Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *