Kysymys:
Miksi int on vain 2 tavua?
Peter Bloomfield
2014-02-20 17:37:03 UTC
view on stackexchange narkive permalink

Kun käytät C / C ++: ta muilla alustoilla, int -tyyppi on tyypillisesti 4 tavua (tai mahdollisesti enemmän). Arduinolla se on kuitenkin vain 2 tavua.

Miksi se eroaa? Vaikuttaako se suorituskykyyn, jos käytän aina 4 tavun long -kohtaa?

Huomaa, että "int" on 4 tavua Arduino Due -sovelluksessa. "Lyhyt" on 2 tavua kaikilla olemassa olevilla Ardunioilla, mutta korostan muiden neuvoja käyttää "int16_t" tai "uint16_t".
Kaksi vastused:
#1
+10
Cybergibbons
2014-02-20 19:55:45 UTC
view on stackexchange narkive permalink

ATmega328, jota käytetään monissa Arduinosissa, on 8-bittinen mikrokontrolleri. Tämä tarkoittaa, että rekisterit ovat 8-bittisiä, tietoväylä on 8-bittisiä, portit ovat 8-bittisiä. Järjestelmässä on joitain vähäisiä 16-bittisiä piirteitä (esim. Yksi ajastimista), mutta melkein kaikki on 8-bittisiä.

Siksi useimmat toiminnot käsittelevät 8-bittisiä kerrallaan. Työskentely kaikilla muilla paitsi 8-bittisillä (eli 16- tai 32-bittisillä kokonaisluvuilla ja liukulukuilla) edellyttää, mitä voidaan olennaisilta osin kuvata ohjelmistojen emuloinniksi, jossa kääntäjä käyttää useita ohjeita näiden suurempien muuttujien käsittelemiseksi. p> 8-bittinen on ilmeisesti riittävä osoittamaan 8-bittistä porttia. Se riittää myös käsittelemään monia silmukkalaskureita, palautusarvoja ja ASCII-merkkejä. Se ei kuitenkaan oikeastaan ​​riitä, kun käsitellään numeroita. Allekirjoitettu 8-bittinen int (int8_t) voi edustaa vain -128 -> +127. Allekirjoittamaton (uint8_t) voi edustaa vain 0 -> 255.

8-bittiset kokonaisluvut ovat melko rajoittavia. C / C ++ int: n on edustettava vähintään -32 678 -> + 32 767, joten se kartoitetaan int16_t: hen - pienin koko, joka tekee niin. Tämä antaa hyvän tasapainon kantaman ja tehokkuuden välillä. Tämä on erityisen tärkeää, kun aloittelijat oppivat - ylivuoto ei todellakaan ole sellaista, mitä muut kuin ohjelmoijat ymmärtävät.

Tämän tekeminen vaikuttaa kuitenkin suorituskykyyn, koska useimmat 16-bittiset toiminnot vievät vähintään kaksi kertaa niin kauan kuin 8-bittinen operaatio ja käytä kaksinkertaista määrää rekistereitä. Tämä saattaa vaikuttaa sinulle tai olla tekemättä sitä sinulle.

Monet meistä siirtyvät natiivityyppeihin, kuten int8_t ja uint8_t, koska se antaa sinulle paljon paremman hallinnan.

Vain huomautus: Arduino-tiimi ei ole kartoittanut int-int16_t: tä, "int" on C / C ++ -varattu avainsana ja tyyppikartoitus on osa ABI: tä (http://gcc.gnu.org/wiki/avr- gcc), jota avr-gcc-kääntäjän kehittäjät päättivät seurata. Toinen huomattava ero on "kaksoistyypissä", joka on yleensä 64-bittinen, kun taas avr-gcc on 32-bittinen kuin "kelluva"
Kiitos. Etkö ole varma, miksi kirjoitin sen. Tiedän, että int: n on edustettava 32 678 -> + 32 767 (tosiasiallisesti luulen, että yhdelle NEC-prosessoreista oli oma kääntäjä, joka ei noudattanut tätä). Mielestäni se johtuu siitä, että en pidä piilottamasta leveyksiä sulautetuissa järjestelmissä - int16_t: n käyttö on paljon selkeämpää.
+1 selkeiden natiivityyppien käytöstä! Arduino Due -sovelluksessa ʻint` on 32-bittinen! http://arduino.cc/en/Reference/int
#2
+3
jfpoilpret
2014-02-21 00:37:00 UTC
view on stackexchange narkive permalink

Yksi tärkeä tosiasia C- ja C ++ -kielistä on, että niiden standardit eivät määritä integraalisten ja liukulukujen tyypin kokoa (tavuina).

He määrittelevät vain pienimmät alueet ja näiden alueiden välisen suhteen. , esim.

  alue (lyhyt) < = alue (int) < alue (pitkä)  

Joten esim. int riippuu tyypillisesti:

  • kohdealusta (prosessori)
  • itse kääntäjä
sanotko `sizeof (lyhyt) == sizeof (int) == sizeof (pitkä)` on mahdollista?
@ron-e Teoreettisesti kyllä, se olisi mahdollista. Käytännössä en ole kuitenkaan koskaan nähnyt sitä. Useimmissa kääntäjissä / alustoissa voidaan odottaa (vaikka sitä ei ole määrätty), että "sizeof (lyhyt)


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...