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
éslong
a 32 bites ARM Arduinos-on, például az Due miatt? - Úgy gondolom, hogy a Due miatt egy
int
32 bit, ugyanaz along
. 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 aint
64 bit, akkor along
-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 aword
-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 …