Arduinon tietotyypin int ja long välinen ero

Oppin ohjelmoimaan void este robotti , mutta kun katsoin Koodi näki kaksi tietotyyppiä pitkiä ja int.

Int ovat tietotyyppejä, jotka pitävät -2 147 483 648 – 2 147 483 647. Pitkät ovat myös tietotyyppejä, joilla on -2 147 483 648 – 2 147 483 647.

Int ja long ovat kuin samat, mutta keksin koodin, jossa käytetään kahden tyyppisiä tietotyyppejä, kuten alla on esitetty:

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

Mutta mistä tiedät, milloin tietotyyppiä käytetään? Etsin paljon verkosta, mutta en ymmärtänyt, voiko joku selittää tämän minulle.

Kommentit

  • " Int ovat tietotyyppejä, joilla on -2 147 483 648 – 2 147 483 647 " Mistä kuulit sen?

vastaus

Arduinossa (AVR-mallit) int on 16 bittiä, ei 32 bittiä. Siten se siirtyy arvosta -32768 arvoon +32767.

Tämä on erilainen ja long, joka on 32 bittiä.

Kommentit

  • Mitkä ovat int ja long 32-bittisissä ARM-arduinosissa, kuten Due?
  • Luulen Due-osassa, että int on 32 bittiä, sama a long. Katso esimerkiksi täältä .

Vastaa

int AVR GCC: ssä on 16 bittiä , ei 32.

Vastaa

C-kielimäärityksen mukaan , int on oltava vähintään 16 bittiä tai pidempi ja long vähintään 32 bittiä.

Kääntäjän on hyvä toteuttaa int 32-bittisenä tai jopa 64-bittisenä. Kääntäjän on hyvä toteuttaa long vähintään 64-bittisenä. Kääntäjä ei kuitenkaan saa toteuttaa long 16-bittisenä.

Joten milloin tyyppiä käytetään?

Jos arvot jonka kanssa työskentelet, voidaan edustaa 16 bitin sisällä, niin on OK käyttää int. Jos tarvitset yli 16 bittiä, käytä long. Jos tarvitset yli 32 bittiä, käytä long long.

Älä tartu kääntäjän ja / tai suorittimen ominaisuuksiin. Kuten muut mainitsivat, jopa Samassa tuotevalikoimassa, Arduinos, on käytettävissä 16- ja 32-bittisiä prosessoreita. Luota sen sijaan vain siihen, mitä standardi takaa.

C-tyyppien täydellinen määritys on:

  • char on oltava vähintään 8 bittiä
  • int on oltava vähintään 16 bittiä
  • long on oltava vähintään 32 bittiä
  • long long on oltava vähintään 64 bittiä

Huomaa: Kääntäjien on täysin laillista toteuttaa char, int, long ja long long 64 bittiä. Tämä ei todellakaan ole harvinaista DSP: n keskuudessa.

Kommentit

  • Lisäksi: Lue kääntäjän dokumentaatio
  • Ja: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) standardin mukaan. Joten jos int on 64 bittiä, niin myös long on oltava vähintään 64 bittiä.

vastaus

Sillä on samat perustelut kuin C: ssä: odotetaan int -tyypin kokoa olla luonnollinen sanakoko, jota järjestelmäsi käsittelee tehokkaimmin . Sen on oltava myös vähintään 16 bittiä leveä, vähintään short eikä suurempi kuin long.

Joten int voi olla 16-, 32- tai 64-bittinen riippumatta siitä, mitä järjestelmä käsittelee parhaiten, ja se on todennäköisesti 16 bittiä leveä 8- tai 16-bittisellä suorittimella, 32 32-bittisellä suorittimella jne.

Käytän int kun haluan parhaan suorituskyvyn, samalla kun vartioin, kun tarvitsen enemmän kantamaa kuin mitä 16 bittiä tarjoaa. Nykyään sinulla on tapana tietää, kun kirjoitat sovelluskoodia 16-bittisille järjestelmille, vaikka se ei ole niin totta ”kirjasto” -koodille, jossa siirrettävyys voi olla suurempi huolenaihe.

Jos oletat, että kirjoittaja oli valinnut tyypin huolellisesti, esimerkissäsi int -muuttujat tarvitsevat todennäköisesti pienen alueen ja niillä olisi varaa olla sanakokoisia , mikä johtaa mahdollisesti lyhyempään tai nopeampaan koodiin (tai molempiin). long vaaditaan oletettavasti yli 16-bittistä aluetta (niiden taataan olevan vähintään 32 bittiä leveitä). Prosessorissa, jonka valitsit kääntökohteeksi, näyttää siltä, että int ja long on molemmat toteutettu 32-bittisinä; tämä olla erilainen (tai pitäisi olla), jos valitsit 16-bittisen kohdeprosessorin.

Vastaus

Haluan käyttää tyyppejä kohteesta stdint.h.

Vaikka heillä onkin pieniä haittoja, niiden tarjoama etu on se, että tiedät tarkalleen käsittelemäsi koon myös muilla arkkitehtuureilla.

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

Mutta tietysti et halua liikkua joukossa int32_t, kun tietosi tarvitsevat vain int16_t.

Kommentit

  • Joten älä käytä konesanaa koko ei vaikuta AVR: n suorituskykyyn?
  • @Ren é – Sanan koon käyttämättä jättäminen voi yleensä vaikuttaa suorituskykyyn useimmissa suorittimissa. Mutta perinteisesti AVR-suorittimilla on 8-bittisiä rekistereitä & -akut, joissa on noin 16-bittiset ohjeet osoitinoperaatioita varten. Joten kun ohjelmoin, saan koodin toimimaan ensin, ja sitten optimoimaan nopeuden jos se ' ovat liian hitaita.
  • @Ren é – Mutta jos haluat todella olla pedanttinen siinä, voit käyttää word tietotyyppisi. Tämä on 16 bittiä Arduino Unolla ja 32 bittiä Arduino Due & nollalla. Mutta tämä palaa ongelmaan, että oikeastaan tiedetään vain tietotyyppisi vähimmäiskoko. Oletetaan, että käytät word -tunnusta joissakin Due-koodeissa, mutta haluat sitten palata Unoon ?! Sen sijaan uint32_t: n käyttö ratkaisisi tämän ongelman ennen sen alkamista, mutta kyllä, se on sanakoko alle optimaalinen Unossa. Entä tulevaisuuden Arduino-levyt … mikä sanakoko heillä on? 32? 64? 128 !?
  • OK. Joten käytän konesanan kokoa (int? WORD näyttää olevan obselete-ikkunatyypin määritelmä), jos alaraja on riittävä, en välitä muistin koosta ja tarvitsen nopeutta, * _t jos välitän koosta?
  • romuta tämä … gnu.org/software/libc/manual/html_node/Integers.html sanoo *fast*_t näyttää olevan oikea tapa edetä …

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *