Char till int och vice versa verkar fungera, hur?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
bearing
Inlägg: 11230
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av bearing »

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.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av Mr Andersson »

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)
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 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 int_leastN_t där N=[8,16,32,64] är garanterade att finnas i C99+
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av Icecap »

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.
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av Findecanor »

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.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av Mr Andersson »

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
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av sodjan »

Eller... Det har bara varit 16 bitar sedan ANSI C89. :-)
Är glaset halvfullt eller halvtomt?
bearing
Inlägg: 11230
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av bearing »

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 4 oktober 2019, 10:29:28, redigerad totalt 1 gång.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Char till int och vice versa verkar fungera, hur?

Inlägg av sodjan »

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.
Skriv svar