Különbség az int és a hosszú között az Arduino

void akadályrobot hoz tanultam programozni, de amikor megnéztem kódot két hosszú és hosszú adattípust láttam. Hosszúak azok az adattípusok is, amelyek -2 147 483 648 és 2 147 483 647 értékeket tartalmaznak.

Az Int és a hosszú megegyezik, de előálltam azzal a kóddal, ahol kétféle adattípust használunk, az alábbiak szerint: “7c70f69706”>

De honnan lehet tudni, hogy melyik adattípust mikor kell használni? Sokat keresgéltem az interneten, de nem értettem, ezért tudná ezt valaki elmagyarázni nekem.

Megjegyzések

  • ” Int olyan adattípus, amely -2 147 483 648 – 2 147 483 647 ” Hol hallotta ezt?

Válasz

Az Arduino (AVR modellek) esetében egy int 16, nem 32 bit. Így -32768-ról +32767-re változik.

Ez eltér long ami 32 bites.

Megjegyzések

  • Mekkora a int és long a 32 bites ARM Arduinos-on, például az Due miatt?
  • Úgy gondolom, hogy a Due miatt egy int 32 bit, ugyanaz a long. Lásd például itt .

Válasz

int az AVR GCC-ben 16 bitek , nem 32.

Válasz

A C nyelv specifikációja szerint , a int legalább 16 bitesnek és a long legalább 32 bitesnek kell lennie.

A fordító számára rendben van, ha a int fájlt 32 vagy akár 64 bitként valósítja meg. A fordító számára rendben van, ha a long fájlt 64 bites vagy annál hosszabb ideig hajtja végre. De a fordító számára nem engedélyezett a long 16 bitként való megvalósítása.

Tehát mikor melyik típust használja?

Ha az értékek amellyel dolgozni fog, 16 biten belül képviselhető, akkor rendben van a int használata. Ha 16-nál több bitre van szüksége, használja a long. Ha 32 bitnél többre van szüksége, használja a következőt: long long.

Ne érje a fordító és / vagy a CPU sajátosságait. Amint mások már említették, még a ugyanaz a termékcsalád, az Arduinos, 16 és 32 bites CPU-k állnak rendelkezésre. Ehelyett csak abban bízzon, amit a szabvány garantál.

A C típusok teljes specifikációja:

  • char legalább 8 bit legyen
  • int legalább 16 bit
  • long legalább 32 bitesnek kell lennie
  • long long legalább 64 bitesnek kell lennie

Megjegyzés: A fordítók számára teljesen legális a char, int, long és long hosszúságú implementáció mint 64 bit. Ez valójában nem ritka a DSP-k körében.

Megjegyzések

  • Továbbá: Olvassa el a fordító dokumentációját
  • És: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) a szabvány szerint. Tehát, ha a int 64 bit, akkor a long -nek is legalább 64 bitnek kell lennie.

Válasz

Ugyanaz az érvelés, mint a C-ben: a int típus mérete várható az a természetes szóméret, amelyet a rendszer a leghatékonyabban kezel . Legalább 16 bit szélesnek kell lennie, nem lehet kisebb, mint egy short, és nem lehet nagyobb mint egy long.

Tehát egy int 16, 32 vagy 64 bites lehet bármi, amit a rendszere legjobban kezel, és így valószínűleg 16 bit széles lesz egy 8 vagy 16 bites CPU-n, 32 egy 32 bites CPU-n stb.

A “2ebfa52def”>

amikor a legjobb teljesítményt akarom, miközben vigyázok arra, hogy vigyázzak, ha nagyobb hatótávolságra van szükségem, mint amennyit 16 bit kínál. Manapság hajlamos vagy tudni, mikor írsz alkalmazáskódot 16 bites rendszerekhez, bár ez nem annyira igaz a “könyvtár” kódra, ahol a hordozhatóság lehet nagyobb aggodalomra ad okot.

A példádban, feltételezve, hogy a szerző gondosan választotta ki a típusaikat, a int változók valószínűleg kis tartományt igényelnek, és megengedhetik maguknak, hogy szóméretűek legyenek , ami rövidebb vagy gyorsabb kódhoz (vagy mindkettőhöz) vezet. A long feltehetően több mint 16 bites tartományra van szükség (garantáltan legalább 32 bit széles). A fordítási célként kiválasztott processzoron úgy tűnik, hogy a int és a long fájlok egyaránt 32 bitesek lettek megvalósítva; legyen más (vagy kell legyen), ha 16 bites cél CPU-t választott.

Válasz

Szeretem használni a következő típusokat: stdint.h.

Noha vannak kisebb hátrányaik, az az előnyük, hogy pontosan ismeri a méretet, még akkor is, ha más architektúrákon áll össze.

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

De nyilvánvalóan nem akar egy csomó int32_t körül mozogni, amikor az adatainak csak int16_t-re van szükségük.

Megjegyzések

  • Tehát ne gépi szót használjon A méret nem befolyásolja az AVR teljesítményét?
  • @Ren é – Általában a szóméret hiánya hatással lehet a legtöbb CPU teljesítményére. De hagyományosan az AVR CPU-k 8 bites regiszterekkel rendelkeznek & akkumulátorok, mintegy 16 bites utasításokkal a mutatóműveletekhez. Tehát amikor programozok, először a kódot futtatom, majd optimalizálom a sebességet ha ez ‘ s túl lassú.
  • @Ren é – De ha valóban pedáns akar lenni benne, használhatja word mint adattípus. Ez 16 bit az Arduino Uno-n, és 32 bit az Arduino Due & Zero esetén. De ez visszatér arra a problémára, hogy valóban csak az adattípus minimális méretét ismerjük. Tegyük fel, hogy a word -t használja valamilyen Due kódon, de aztán vissza akarja kapcsolni Unót ?! Helyette az uint32_t használata megoldaná ezt a problémát, még mielőtt elindulna, de igen, a szó mérete optimálisabb lesz az Uno-n. Mi van a jövő Arduino táblákkal … milyen méretű szavak lesznek? 32? 64? 128 !?
  • OK. Tehát a gépi szó méretét használnám (az int? A WORD obselete windows típusú definíciónak tűnik), ha az alsó határ elegendő, nem érdekel a memória mérete, és szükségem van a sebességre, * _t ha érdekel a méret?
  • selejt, hogy … gnu.org/software/libc/manual/html_node/Integers.html mondja *fast*_t járható út …

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük