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
jalong
32-bittisissä ARM-arduinosissa, kuten Due? - Luulen Due-osassa, että
int
on 32 bittiä, sama along
. 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 josint
on 64 bittiä, niin myöslong
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ätword
-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ä …