Fråga:
Varför är int bara 2 byte?
Peter Bloomfield
2014-02-20 17:37:03 UTC
view on stackexchange narkive permalink

När du använder C / C ++ på andra plattformar är typen int vanligtvis 4 byte (eller potentiellt fler). Men på Arduino är det bara två byte.

Varför är det annorlunda? Påverkar det prestanda om jag alltid använder 4 byte lång istället?

notera att 'int' är 4 byte på Arduino Due. En "kort" kommer att vara 2 byte på alla befintliga Ardunios, men jag betonar de andras råd att använda "int16_t" eller "uint16_t".
Två svar:
#1
+10
Cybergibbons
2014-02-20 19:55:45 UTC
view on stackexchange narkive permalink

ATmega328 som används i många Arduinos är en 8-bitars mikrokontroller. Detta innebär att register är 8 bitar, databussen är 8 bitar, portarna är 8 bitar. Det finns några minimala 16-bitarsaspekter på systemet (t.ex. en av timern), men nästan allt är 8-bitar.

Därför hanterar de flesta operationer 8-bitar åt gången. Att arbeta på vad som helst utom 8-bitar (dvs. 16-bitars eller 32-bitars heltal och flytande siffror) kräver vad som i huvudsak kan beskrivas som mjukvaruemulering, där kompilatorn använder flera instruktioner för att arbeta med dessa större variabler. p> 8-bitar är uppenbarligen tillräcklig för att adressera en 8-bitarsport. Det räcker också att hantera många loop-räknare, returvärden och ASCII-tecken. Det räcker dock inte när man hanterar siffror. En signerad 8-bitars int (int8_t) kan endast representera -128 -> +127. Osignerad (uint8_t) kan endast representera 0 -> 255.

8-bitars heltal är ganska begränsande. C / C ++ int måste representera minst -32,678 -> +32,767 så mappar till int16_t - den minsta storleken som kommer att göra det. Detta ger en bra balans mellan räckvidd och effektivitet. Detta är särskilt viktigt när nybörjare lär sig - överflöd är egentligen inte något som icke-programmerare förstår. en 8-bitars operation och använder dubbelt så många register. Det här kan eller inte kan göra skillnad för dig.

Många av oss byter till de inhemska typerna som int8_t och uint8_t eftersom det ger dig mycket mer kontroll.

Bara en anmärkning: det är inte Arduino-teamet som mappade int till int16_t, "int" är ett C / C ++ reserverat nyckelord, och typmappningen är en del av ABI (http://gcc.gnu.org/wiki/avr- gcc) som avr-gcc-kompilatorns utvecklare bestämde sig för att följa. En annan anmärkningsvärd skillnad är i den "dubbla" typen som vanligtvis är 64bit bred, medan i avr-gcc är 32bit som "float"
Tack. Inte säker på varför jag skrev det. Jag vet att int måste representera 32 678 -> + 32 767 (men jag tror faktiskt att det fanns en egen kompilator för en av NEC-processorerna som inte följde detta). Jag tror att det beror på att jag inte gillar att dölja bredder på inbäddade system - att använda int16_t är mycket tydligare.
+1 för användning av tydliga inhemska typer! På Arduino Due är en 'int' 32-bitars! http://arduino.cc/en/Reference/int
#2
+3
jfpoilpret
2014-02-21 00:37:00 UTC
view on stackexchange narkive permalink

Ett viktigt faktum om C- och C ++ -språken är att deras respektive standarder inte definierar storleken (i byte) på integrerade och flytande nummertyper.

De definierar bara minimala intervall och relation mellan dessa intervall , t.ex.

  intervall (kort) < = intervall (int) < intervall (långt)  

Så storleken på t.ex. en int beror vanligtvis på:

  • målplattformen (processorn)
  • själva kompilatorn
säger du att 'sizeof (short) == sizeof (int) == sizeof (long)' är möjligt?
@ron-e Teoretiskt sett skulle det vara möjligt. I praktiken har jag dock aldrig sett det. I de flesta kompilatorer / plattformar kan man förvänta sig (även om det inte införs) att `sizeof (short)


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...