Küsimus:
Miks on int ainult 2 baiti?
Peter Bloomfield
2014-02-20 17:37:03 UTC
view on stackexchange narkive permalink

Kui kasutate C / C ++ teistel platvormidel, on tüüp int tavaliselt 4 baiti (või potentsiaalselt rohkem). Arduino puhul on see siiski ainult 2 baiti.

Miks see erineb? Kas see mõjutab jõudlust, kui kasutan selle asemel alati 4-baidist long ?

Pange tähele, et `int` on Arduino Due'is 4 baiti. Lühike on 2-baidine kõigil olemasolevatel Ardunios, kuid ma rõhutan teiste nõuannet kasutada „int16_t” või „uint16_t”.
Kaks vastused:
#1
+10
Cybergibbons
2014-02-20 19:55:45 UTC
view on stackexchange narkive permalink

ATmega328, mida kasutatakse paljudes Arduinos, on 8-bitine mikrokontroller. See tähendab, et registrid on 8-bitised, andmesiin on 8-bitised, pordid on 8-bitised. Süsteemil on mõned minimaalsed 16-bitised aspektid (nt üks taimeritest), kuid peaaegu kõik on 8-bitine.

Seetõttu käsitsevad enamus toiminguid korraga 8-bitist. Töötamine kõigega, välja arvatud 8-bitised (st 16- või 32-bitised täisarvud ja ujukomaarvud), nõuab sisuliselt tarkvaraemuleerimist, kus kompilaator kasutab nende suuremate muutujate töötamiseks mitut käsku. p> 8-bitine on ilmselgelt piisav 8-bitise pordi aadressimiseks. Piisab ka paljude tsükliloendurite, tagastusväärtuste ja ASCII tähemärkidega tegelemisest. Numbrite käsitlemisel ei piisa sellest tegelikult. Allkirjastatud 8-bitine int (int8_t) võib tähistada ainult -128 -> +127. Allkirjata (uint8_t) võib tähistada ainult 0 -> 255.

8-bitised täisarvud on üsna piiravad. C / C ++ int peab esindama vähemalt -32 678 -> + 32 767, seega kaardistab int16_t - väikseim suurus, mis seda teeb. See annab hea vahemiku ja efektiivsuse tasakaalu. See on eriti oluline, kui algajad õpivad - ülevool ei ole tegelikult midagi, millest mitte-programmeerijad aru saavad.

Selle tegemine mõjutab aga jõudlust, sest enamik 16-bitiseid toiminguid võtab vähemalt kaks korda kauem aega kui 8-bitine toiming ja kasutage kaks korda rohkem registreid. See võib teile midagi muuta või mitte.

Paljud meist lähevad üle omatüüpidele, näiteks int8_t ja uint8_t, kuna see annab teile palju suurema kontrolli.

Lihtsalt märkus: int ar int16_t pole kaardistanud Arduino meeskond, "int" on reserveeritud C / C ++ märksõna ja tüübikaardistamine on osa ABI-st (http://gcc.gnu.org/wiki/avr- gcc), mida avr-gcc kompilaatori arendajad otsustasid järgida. Teine märkimisväärne erinevus on "topelt" tüüpi, mis on tavaliselt 64-bitine, samas kui avr-gcc on 32-bitine nagu "ujuk"
Aitäh. Pole kindel, miks ma selle kirjutasin. Ma tean, et int peab esindama 32 678 -> + 32 767 (kuigi tegelikult arvan, et ühe NEC-i protsessori jaoks oli olemas kompileerija, kes seda ei järginud). Ma arvan, et see tuleneb sellest, et mulle ei meeldi manustatud süsteemide laiuste peitmine - int16_t kasutamine on palju selgem.
+1 selgete kohalike tüüpide kasutamise eest! Arduino Due'is on ʻint` 32-bitine! http://arduino.cc/en/Reference/int
#2
+3
jfpoilpret
2014-02-21 00:37:00 UTC
view on stackexchange narkive permalink

Üks oluline fakt C ja C ++ keelte kohta on see, et nende vastavad standardid ei määratle integraalsete ja ujukomaarvude tüüpide suurust (baitides).

Nad määravad lihtsalt minimaalsed vahemikud ja nende vahemike vahelise seose , nt

  range (short) < = range (int) < range (pikk)  

Nii et nt int sõltub tavaliselt:

  • sihtplatvorm (protsessor)
  • kompilaator ise
kas sa ütled, et "sizeof (lühike) == sizeof (int) == sizeof (pikk)" on võimalik?
-1


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...