mikrocontroller.net

Forum: Compiler & IDEs uint16_t oder unsigned int?


Autor: Waldemar T. (sanchez251)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin Einsteiger im Bereich Mikrocontrollerprogrammierung in C. 
Normalerweise versuche ich egal welche Anwendung so flexibel wie möglich 
zu gestalten. Im Tutorial habe ich gesehen, dass Variablen z.b. mit dem 
Dateityp uint16_t anstatt mit einem unsigned int bzw. uint8_t anstatt 
mit unsigned char definiert wurde. Diese Bezeichnungen ersetzen 
sicherlich in irgendeiner Headerdatei oder so die ursprüngliche 
Bezeichnung und sind wenn ich das richtig sehe leichter Lesbar und 
schneller zum tippen. Wenn allerdings der Quellcode von jemandem 
eingesehen wird, dem diese (ich denke speziell für den µC) 
eingerichteten Bezeichnungen unbekannt sind bzw. er diese Headerdatei 
nicht hat, ist der Code demnach nicht so leicht übertragbar...?

Mich interessiert nun ob man sich diese neue Bezeichnung aneignen sollte 
oder ob man von vornherein lieber bei der längeren Schreibweise bleiben 
sollte?

Gruß Waldemar

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den "neuen" Schreibweisen weißt du genau, wieviel Bit deine Variable 
hat. Da das bei einigen "Rechenarten" wichtig ist, ist es notwendig 
diese für eine Portierung auf ein anderes System zu behalten (also die 
Bitzahl).

Gruß,
Lasse

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t wenn es genau 16 Bits sein sollen, des Platzverbrauchs wegen.

unsigned wenn es mindestens 16 Bit sein sollen, es aber auf 32 Bit 
Prozessoren der Effizienz halber auch mehr sein darf.

Autor: Waldemar T. (sanchez251)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, Richtig... Du meinst also, wenn ich die Deklaration "int" lese, weiß 
ich damit nicht auf den ersten Blick, dass sich dahinter 16Bit 
verbergen?

In welcher Headerdatei steht die Erweiterung? Wüsste nicht, dass ich 
diese bewusst in mein Testprogramm eingefügt habe...

Habe bisher io.h und delay.h als allgemeine Headerdateien drin...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Waldemar T. schrieb:

> Wenn allerdings der Quellcode von jemandem
> eingesehen wird, dem diese (ich denke speziell für den µC)
> eingerichteten Bezeichnungen unbekannt sind bzw. er diese Headerdatei
> nicht hat, ist der Code demnach nicht so leicht übertragbar...?

Diese Bezeichnungen sind offizieller Bestandteil des C Standards. Also 
benutze sie ruhig, und zwar nicht nur bei µC-Programmen.

> In welcher Headerdatei steht die Erweiterung?

stdint.h

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Waldemar T. schrieb:

> ja, Richtig... Du meinst also, wenn ich die Deklaration "int" lese, weiß
> ich damit nicht auf den ersten Blick, dass sich dahinter 16Bit
> verbergen?

Yep, kann auch mehr sein. int/unsigned sind die effizientesten Typen 
wenn es sich mindestens um eine 16-Bit Architektur handelt. Bei einer 
8-Bit Architektur sind 8-Bit Typen naturgemäss effizienter.

Autor: Waldemar T. (sanchez251)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:

> Diese Bezeichnungen sind offizieller Bestandteil des C Standards. Also
> benutze sie ruhig, und zwar nicht nur bei µC-Programmen.

Du hast recht, hab es grad in einem anderen C programm ausprobiert... :)

ok, wenn das so ist, ist mir das egal...

Eine Frage habe ich noch:

Habe gerade das Phänimen gehabt, dass ich einem unsigned char abc = 0 
zugewiesen hab (vor der Main Schleife). Erwartungsgemäß wurde damit ein 
Byte in meinem RAM reserviert. Wenn ich allerdings abc = 1 oder 
irgendeinen anderen Werrt zuweise werden zwei Byte im RAM reserviert...

Wieso das ganze?

(Nicht das ich dem Byte hinterherweine, aber das muss doch einen Grund 
haben...)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei "char abc = 0" landet die Variable im bss-Segment, bei "char abc = 
1" im data-Segment. Vermutlich macht das Linkerskript beim data-Segment 
ein Padding auf eine gerade Adresse, weil danach noch das bss-Segment 
kommt, beim bss-Segment aber nicht, weil danach nichts mehr kommt.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Diese Bezeichnungen sind offizieller Bestandteil des C Standards.

Und zwar mittlerweile seit 10 Jahren. stdint.h bietet dir da die 
Typedefs intX_t, int_leastX_t und int_fastX_t, wobei du X durch die 
Bitbreiten ersetzt. Dabei ist ersterer ein Typ mit exakt der angegebenen 
Größe, das zweite ist ein möglichst kleiner Typ, der mindestens die 
Größe hat, und der dritte ein möglichst schneller Typ, der mindestens 
diese Größe hat.

Autor: Großes Fragezeichen (112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe mal eine ganz allgemeine Frage zu den uintX_t Datentypen.

Wofür steht das "_t" am Ende des Types???

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
type

Viele C-Programmierer hängen an Typnamen ein _t an, damit
man sieht, daß dieser Name für einen Typ steht
(so wie p... oder p_... für einen pointer, also Zeiger).

PS:
Das ist soweit durchaus sinnvoll, auch wenn das _t indzischen
(bei C++ vor allem) ersetzt wird durch die Regel:
- ein Kleinbuchstabe am Anfang kennzeichnet ein Objekt (Variable)
- ein Großbuchstabe am Anfang eine Klasse, also einen Typ:
   class Auto
   {
      ...
   };

   Auto einAuto;

PPS: Dann gibt es noch die "ungarische Notation".
Da wird jeder Variablen ein Name gegeben, dessen
Anfang den Typ in Kurzform kennzeichnet, also ui_bla
für eine unsigned int-Variable, d_radius für eine double
etc..
Das habe ich früher schon für Schwachsinn empfunden, aber
es gibt Fans davon. Vor allem Microsoft hat das favorisiert.
Inzwischen ist es vollkommen unsinnig, weil heutige Programme
nicht mehr wie früher mit einer Handvoll Datentypen auskommen.

Aber p vorweg bei Zeigern und _t am Ende bei Typen ist
meistens sinnvoll.

Autor: Großes Fragezeichen (112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieder was gelernt.

thx

Autor: Frank K. (frank)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Waldemar T. schrieb:
> Habe gerade das Phänimen gehabt, dass ich einem unsigned char abc = 0
> zugewiesen hab (vor der Main Schleife). Erwartungsgemäß wurde damit ein
> Byte in meinem RAM reserviert. Wenn ich allerdings abc = 1 oder
> irgendeinen anderen Werrt zuweise werden zwei Byte im RAM reserviert...
>
> Wieso das ganze?

Wenn die Variable mit 0 intialisiert wird landet sie wie oben bereits 
erwähnt im BSS Segment. Dieses wird vom Startup Code mit null vorbelegt 
egal wie gross es ist. Wird die Variable mit != 0 initialisiert landet 
Sie im Data Segment und wird intialisiert. Dazu hat nimmt Startup Code 
die Werte aus dem ROM und kopiert sie ins RAM. Daher ist der benötigte 
Speicher die eigentliche Varibale plus der Intialisierungswert.

Gruß,
Frank

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> unsigned wenn es mindestens 16 Bit sein sollen, es aber auf 32 Bit
> Prozessoren der Effizienz halber auch mehr sein darf.

Wobei das eher ein Fall für uint_fast16_t wäre. ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Wobei das eher ein Fall für uint_fast16_t wäre. ;-)

Richtig. Aber hast du mal aufs Datum vom Beitrag geschaut?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:

> Aber hast du mal aufs Datum vom Beitrag geschaut?

Sorry, nein, hatte die Threadleiche nicht bemerkt. :-(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.