Rozdíl mezi datovým typem int a long na Arduinu

Učil jsem se programovat pro void překážkový robot , ale když jsem se podíval na kód Viděl jsem dva datové typy dlouhý a int.

Int jsou datové typy, které obsahují -2 147 483 648 až 2 147 483 647. Dlouhé jsou také datové typy, které obsahují -2 147 483 648 až 2 147 483 647.

Int a long jsou stejné, ale přišel jsem s kódem, kde se používají dva typy datových typů, jak je vidět níže:

int trigPin = 2; int echoPin = 4; long duration, cm, inches; 

Jak ale můžete vědět, kdy použít který datový typ? Hodně jsem hledal na webu, ale nerozuměl jsem, takže mi to někdo může vysvětlit, prosím.

Komentáře

  • " Int jsou datové typy, které obsahují -2 147 483 648 až 2 147 483 647 " Kde jste to slyšeli?

Odpověď

Na Arduinu (modely AVR) je int 16 bitů, ne 32 bitů. Tedy jde od -32768 do +32767.

To je odlišné od long což je 32 bitů.

Komentáře

  • Jaké jsou šířky int a long na 32bitových ARM Arduinos, například Due?
  • Myslím si, že int je 32 bitů, stejný long. Viz zde například.

Odpověď

int v AVR GCC je 16 bity , ne 32.

Odpověď

Podle specifikace jazyka C , int musí být alespoň 16 bitů nebo delší a long musí být alespoň 32 bitů nebo déle.

Je v pořádku, když kompilátor implementuje int jako 32 bitů nebo dokonce 64 bitů. Je v pořádku, když kompilátor implementuje long 64 bitů nebo déle. Ale není dovoleno, aby kompilátor implementoval long jako 16 bitů.

Takže kdy použít který typ?

Pokud jsou hodnoty s nimiž budete pracovat, může být reprezentován do 16 bitů, pak je v pořádku použít int. Pokud potřebujete více než 16 bitů, použijte long. Pokud potřebujete více než 32 bitů, použijte long long.

Nenechte se zmást specifikami kompilátoru nebo CPU. Jak již zmínili ostatní, dokonce i uvnitř ve stejné produktové řadě, Arduinos, jsou k dispozici 16 a 32 bitové procesory. Místo toho důvěřujte pouze tomu, co standard zaručuje.

Úplná specifikace typů v jazyce C je:

  • char musí být alespoň 8 bitů
  • int musí být alespoň 16 bitů
  • long musí mít alespoň 32 bitů
  • long long musí mít alespoň 64 bitů

Poznámka: Pro překladače je naprosto legální implementovat char, int, long a long long jako 64 bitů. To ve skutečnosti není u DSP neobvyklé.

Komentáře

  • Také: Přečtěte si dokumentaci ke kompilátoru
  • A: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) podle standardu. Pokud má tedy int 64 bitů, musí být long minimálně 64 bitů.

Odpověď

Je to stejné uvažování jako v C: očekává se velikost typu int aby byla přirozená velikost slova, kterou váš systém zvládá nejefektivněji . Musí mít také šířku nejméně 16 bitů, ne menší než short a větší než long.

Takže int může mít 16, 32 nebo 64 bitů na čemkoli, s čím váš systém zachází nejlépe, a tak je pravděpodobně 16bitová šířka na 8bitovém nebo 16bitovém procesoru, 32 na 32bitovém CPU atd.

Používám int když chci nejlepší výkon, a přitom dávat pozor, když potřebuji větší dosah, než nabízí 16 bitů. V dnešní době máte tendenci vědět, když píšete aplikační kód pro 16bitové systémy, ačkoli to „není tak pravdivé pro“ knihovní „kód, kde může být přenositelnost větší obavy.

Ve vašem příkladu, za předpokladu, že autor pečlivě vybral jejich typy, proměnné int pravděpodobně vyžadují malý rozsah a mohly by si dovolit velikost slova , což vede k potenciálně kratšímu nebo rychlejšímu kódu (nebo k oběma). Ty long pravděpodobně vyžadovaly více než 16bitový rozsah (je zaručeno, že budou široké alespoň 32 bitů). Na procesoru, který jste vybrali jako cíl kompilace, to vypadá, že int a long byly oba implementovány jako 32bitové; to by být odlišný (nebo by měl být), pokud jste vybrali 16bitový cílový procesor.

Odpověď

Rád používám typy z stdint.h.

I když mají drobné nevýhody, výhodou, kterou poskytují, je, že přesně víte, jakou velikost zpracováváte, a to i při kompilaci na jiných architekturách.

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

Ale zjevně se nechcete pohybovat kolem hromady int32_t, když vaše data potřebují pouze int16_t.

Komentáře

  • Takže nepoužíváte strojové slovo velikost neovlivní výkon na AVR?
  • @Ren é – Obecně nepoužívání velikosti slova může ovlivnit výkon na většině procesorů. Ale CPU AVR mají tradičně 8bitové registry & akumulátory s přibližně 16bitovými instrukcemi pro operace ukazatele. Takže když programuji, nejprve spustím kód a poté optimalizuji pro rychlost if it ' je příliš pomalý.
  • @Ren é – ale pokud o tom opravdu chcete být pedantský, můžete použít word jako datový typ. To je 16 bitů na Arduino Uno a 32 bitů na Arduino kvůli & nule. Ale to se vrací k problému skutečně znát pouze minimální velikost vašeho datového typu. Řekněme, že používáte word u nějakého Due kódu, ale pak chcete back-port na Uno ?! Použití uint32_t místo toho by tento problém vyřešilo před jeho spuštěním, ale ano, na Uno to bude neoptimální. A co budoucí desky Arduino … jakou velikost slova budou mít? 32? 64? 128 !?
  • OK. Takže bych použil velikost slova stroje (int? WORD se zdá být zastaralou definicí typu Windows), pokud je spodní limit dostatečný, nezajímá mě velikost paměti a potřebuji rychlost, * _t, pokud mi záleží na velikosti?
  • zrušit to … gnu.org/software/libc/manual/html_node/Integers.html říká *fast*_t Zdá se, že je to správná cesta …

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *