Forum: Mikrocontroller und Digitale Elektronik AVR//C// Variablen-Typen unterschiede


von __Son´s B. (bersison)


Lesenswert?

Hallo,
eingeleuchtet ist mir noch nicht wo der praktische Unterschied bei den 
beiden Variablen-Deklarationen ist;

char vs. int8_t
unsigned char vs. uint8_t
etc.

Ich habe beide Schreibweisen, teils im gleichen Quellcode gelesen.
Handelt es sich um reine Geschmackssache, oder gibt es ernstzunehmende 
Unterschiede zw. den beiden Typen-Deklarationen?

von Student (Gast)


Lesenswert?

Hallo,

char ist identisch zu int8_t und unsigned char zu uint8_t!

Im Grunde ist es also Geschmacksache, aber man sieht bei der Definition 
von uint8_t sofort welche Breite die Variablen haben!

lg

von Stefan E. (sternst)


Lesenswert?

Student schrieb:
> char ist identisch zu int8_t

Nein. 'signed char' wäre identisch. Ein 'char' ist ein dritter Typ, der 
weder signed noch unsigned ist. Klar, auf binärer Ebene muss er 
natürlich eines von beiden sein, aber was ist nicht festgelegt, der 
Compiler entscheidet das (oder halt der User über Optionen).

von __Son´s B. (bersison)


Lesenswert?

DANKE!
Hatte ich mir schon gedacht, war aber doch etwas unsicher, weil beide 
gemischt verwendet wurden.

von Stefan (Gast)


Lesenswert?

Die Aussage, das char = int8_t ist beruht auf Informationen in 
CPU-spezifischen Header Dateien. Sie gilt also für einige CPU's, aber 
nicht zwangsläufig für alle.

Ich glaube, dass sie beim gcc für alle 8 bit CPU's gilt.

von K. B. (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Klar, auf binärer Ebene muss er
> natürlich eines von beiden sein

Auf binärer Ebene ist erst einmal alles nur eine (8 Bit lange) Folge von 
0ern und 1ern. Der CPU ist das relativ egal, wie wir als Menschen es 
dann interpretieren bzw. welche Operationen wir damit durchführen 
lassen.

von Stefan E. (sternst)


Lesenswert?

Stefan schrieb:
> Die Aussage, das char = int8_t ist beruht auf Informationen in
> CPU-spezifischen Header Dateien. Sie gilt also für einige CPU's, aber
> nicht zwangsläufig für alle.
>
> Ich glaube, dass sie beim gcc für alle 8 bit CPU's gilt.

Nein, denn wie bereits gesagt:
int8_t = signed
char = unbestimmte Signedness

Ein int8_t kann man höchstens mit 'signed char' gleichsetzen, aber nie 
mit 'char'.

von Stefan E. (sternst)


Lesenswert?

K. B. schrieb:
> Stefan Ernst schrieb:
>> Klar, auf binärer Ebene muss er
>> natürlich eines von beiden sein
>
> Auf binärer Ebene ist erst einmal alles nur eine (8 Bit lange) Folge von
> 0ern und 1ern. Der CPU ist das relativ egal, wie wir als Menschen es
> dann interpretieren bzw. welche Operationen wir damit durchführen
> lassen.

Ach Herrgott, mit "binärer Ebene" meinte ich hier natürlich den vom 
Compiler generierten Code. Der muss natürlich ein 'char' entweder signed 
oder unsigned interpretieren, auch wenn er auf C Ebene eben weder das 
eine, noch das andere ist.

von Stefan W. (xerox)


Lesenswert?

char:
Eine Variable für ASCII Zeichen welche 8 oder mehr Bit haben kann. Dies 
ist grundsätzlich vom verwendeten System bzw. Plattform abhängig.

int8_t:
Die Variable vom Typ int (Integer) kann 8 oder mehr Bits haben, mal 
wieder vom System/Plattform abhängig. int8_t wurde definiert um klar zu 
zeigen das dieser typ immer 8 Bit breit ist, egal auf welchem 
System/Plattform.

Zum Thema signed und unsigned muss ich denke ich nichts sagen.


mfg xerox

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Vorzeichen von "char" ist iplementation defined, d.h. wird durch 
die Implementation gegeben.

Beim GCC wiederum legt die Implementation das Vorzeichen von char nicht 
unmittelbar fest, sonders es wird festgelegt durch das jeweilige ABI.

Da nicht gesagt wurde, um welche Implementation es sich handelt, kann 
daher auch nichts über das Vorzeichen von char gesagt werden.

Beim avr-gcc etwa ist char Vorzeichenbehaftet, siehe das avr-gcc ABI

http://gcc.gnu.org/wiki/avr-gcc#ABI

Allerdings verwenden viele Anwender ein anderes ABI — i.d.R ohne sich 
dessen bewusst zu sein.

von Fabian O. (xfr)


Lesenswert?

__Son´s Bersi__ schrieb:
> Handelt es sich um reine Geschmackssache, oder gibt es ernstzunehmende
> Unterschiede zw. den beiden Typen-Deklarationen?

Zu dem Thema gibt es hier einen Artikel:
http://www.mikrocontroller.net/articles/Plattformunabh%C3%A4ngigkeit

von __Son´s B. (bersison)


Lesenswert?

Fabian O. schrieb:
> Zu dem Thema gibt es hier einen Artikel:
> http://www.mikrocontroller.net/articles/Plattformu...

... doch ein äußerst anspruchsvolles Thema!

Wenn ich es richtig verstehe, ist die interessanteste 8bit-Deklaration
"int_fast8_t" und "uint_fast8_t", da hier die größten hardwareabhängigen 
Kompatibilitätsprobleme auftreten können.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.