Buggfix Plus
Aktuellt datum och tid: 13.09 2019-10-22

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 23 inlägg ]  Gå till sida Föregående  1, 2
Författare Meddelande
InläggPostat: 11.49 2019-10-02 

Blev medlem: 01.01 2006-03-02
Inlägg: 7766
Ort: Vänersborg
Jag är rätt säker på att C-standarden säger att int måste vara minst 16 bitar. Vissa specialkompilatorer för 8-bit MCU bryter mot regeln. Men i avr-gcc är int 16 bitar, trots 8-bits processor.


Upp
 Profil  
 
InläggPostat: 11.58 2019-10-02 

Blev medlem: 21.06 2011-01-29
Inlägg: 883
Icecap skrev:
int som variabeltyp är besvärlig.

C-definitionen är att int är en typ som µC'n "naturligt" kommer åt med minimalt antal läsningar.

Alltså: i en 8-bitars µC är det en byte (fast då signed), i en 32-bitars µC är det (nästan alltid) en signed long.

Det är lite synd att de numeriska typerna bara är "mjukt" specade. Men några regler finns det i standarden.
int är garanterat minst 16 bitar, ingen hård övre gräns.
int är garanterat minst lika stor som short
int är garanterat inte större än long (som i sin tur är minst 32 bitar)

Citera:
Ska man alltså göra portable funktioner ska man använda de nyare definitioner (t.ex. int8_t, uint8_t, int16_t, uint16_t osv.) där man säkerställer att variablerna får minst rätt storlek. Dessa definitioner finns med från c99 och C++11.

:tumupp:
Jag strök ordet minst för [u]intN_t-typerna är exakta. Dom är också valfria att implementera för kompilatortillverkaren så det finns inga garantier att de finns.
Man kan vara rätt säker på att 8, 16 & 32 finns på de flesta system, men saker som t.ex. int24_t är lite mer ovanliga.

Om man bara vill ha en typ som rymmer minst N bitar men inte bryr sig ifall den blir lite för stor finns [u]int_leastN_t där N=[8,16,32,64] är garanterade att finnas i C99+


Upp
 Profil  
 
InläggPostat: 12.44 2019-10-02 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 24099
Ort: Aabenraa, Danmark
I ANSI C är en int bara specat som "den för processorn naturliga storlek" och den är INTE garanterat att vara 16 bit lång!

Senare versioner har detta med en int är 16 bit.

Och det betyder att om man kompiilerar en 'modern' kod på en 'gammal' kompiler kan det uppstå problemer.
Och det KAN ske att kompilern är gammal, kanske för att det är en gammal grunka som måste debuggas o det bara finns en kompiler till skiten.


Upp
 Profil  
 
InläggPostat: 14.37 2019-10-02 

Blev medlem: 22.04 2010-07-02
Inlägg: 641
bearing skrev:
Men i avr-gcc är int 16 bitar, trots 8-bits processor.

... Om man inte sätter parametern "-mint8" för då blir en int 8 bittar, trots standarden.


Upp
 Profil  
 
InläggPostat: 16.53 2019-10-02 

Blev medlem: 21.06 2011-01-29
Inlägg: 883
Icecap skrev:
I ANSI C är en int bara specat som "den för processorn naturliga storlek" och den är INTE garanterat att vara 16 bit lång!

Senare versioner har detta med en int är 16 bit.

Och det betyder att om man kompiilerar en 'modern' kod på en 'gammal' kompiler kan det uppstå problemer.
Och det KAN ske att kompilern är gammal, kanske för att det är en gammal grunka som måste debuggas o det bara finns en kompiler till skiten.

Det har alltid varit 16 bitar ända sen ANSI C89.
https://www.pdf-archive.com/2014/10/02/ ... 1990-1.pdf
5.2.4.2.1 Sizes of integral types


Upp
 Profil  
 
InläggPostat: 17.05 2019-10-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 37927
Ort: Söderköping
Eller... Det har bara varit 16 bitar sedan ANSI C89. :-)
Är glaset halvfullt eller halvtomt?


Upp
 Profil  
 
InläggPostat: 13.04 2019-10-03 

Blev medlem: 01.01 2006-03-02
Inlägg: 7766
Ort: Vänersborg
Det är ju bra att stdint biblioteket finns, så att man inte behöver vara osäker på om man får ett 8-bit eller 64-bit heltal när man deklarerar en int.

Angående detta med "least 8 bit int", så är det väl så att på processorer med 32-bits-register så körs väl i många arkitekturer alla beräkningar med 32-, eller iaf 16-bit operationer även med variabler deklarerade som int8. Men den genererade koden kanske blir lite kompaktare ifall variabeln istället är deklarerad typ intleast8? eftersom att koden då inte borde behöva maska bort de högre delarna av registrena hela tiden?


Senast redigerad av bearing 09.29 2019-10-04, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 15.18 2019-10-03 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 37927
Ort: Söderköping
Många har inte heller byte I/O mot minnet så de får läsa
32 eller 64 bits och ha extra maskningsoperationer.

Men det kanske är vanligare i arkitekturer för inbyggda system
att det även finns byte I/O.

Samma sak gäller för "alignment". Vissa arkitekturer får mer
eller mindre problem om variabler inte ligger på jämna 32 eller
64 bitars gränser. Det blir extra I/O för att läsa/maska/skifta.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 23 inlägg ]  Gå till sida Föregående  1, 2

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010