überall verfügbar?

26/01/2014 - 20:14 von Gregor Szaktilla | Report spam
Hallo zusammen,

ich beschàftige mich seit geraumer Zeit mit dem ATmega168.

Vor rund zwei Wochen habe ich mich mit einem „Fehler“ herumgeschlagen,
der am Ende darauf zurückzuführen war, dass die Interpretation von char
plattformabhàngig ist. Bislang war ich gewohnt, dass ein char ein
vorzeichenloses Acht-Bit-Ding ist, der AVR interpretiert das aber wohl
als Sieben-Bit-Ding plus Vorzeichen (was saublöd ist, wenn man, wie ich,
bis 128 zàhlen und dafür char verwenden möchte).

Jetzt frage ich mich, ob es sinnvoll ist, grundsàtzlich stdint.h zu
inkludieren und nur noch mit uint8_t, sint8_t usw. zu arbeiten. Da ich
aber so portabel wie möglich programmieren möchte, wüsste ich gerne, ob
stdint.h immer und überall vorhanden ist.

Weiß jemand die Antwort und kann mich schlauer machen?

TIA+Gruß

Gregor
 

Lesen sie die antworten

#1 Peter J. Holzer
26/01/2014 - 20:55 | Warnen spam
On 2014-01-26 19:14, Gregor Szaktilla wrote:
ich beschàftige mich seit geraumer Zeit mit dem ATmega168.

Vor rund zwei Wochen habe ich mich mit einem „Fehler“ herumgeschlagen,
der am Ende darauf zurückzuführen war, dass die Interpretation von char
plattformabhàngig ist. Bislang war ich gewohnt, dass ein char ein
vorzeichenloses Acht-Bit-Ding ist,



Interessant. Unter den C-Compilern, mit denen ich in den letzten 27
Jahren zu tun hatte, war signed char wesentlich hàufiger als unsigned
char. (Ich gebe aber zu, dass meine Auswahl etwas einseitig war)

der AVR interpretiert das aber wohl als Sieben-Bit-Ding plus
Vorzeichen (was saublöd ist, wenn man, wie ich, bis 128 zàhlen und
dafür char verwenden möchte).



Ich kenne dan ATmega168 nicht, aber tatsàchlich 7 Bit plus Vorzeichen,
nicht 8 Bit Zweierkomplement? Ich bin beeindruckt. sowas kannte ich
bisher nur in der Theorie. Dass man mit einem vorzeichenbehafteten
8-Bit-Wert aber nur bis 127 zàhlen kann, ist bei allen im C-Standard
erlaubten Darstellungsformen der Fall.


Jetzt frage ich mich, ob es sinnvoll ist, grundsàtzlich stdint.h zu
inkludieren und nur noch mit uint8_t, sint8_t usw. zu arbeiten. Da
ich aber so portabel wie möglich programmieren möchte, wüsste ich
gerne, ob stdint.h immer und überall vorhanden ist.



Kommt darauf an, was Du mit "immer und überall" meinst. <stdint.h> ist
in C99 definiert, aber noch nicht in C89. Ist Dir ein 14 Jahre alter
Standard alt genug, oder willst Du auch mit Systemen kompatibel sein,
die nur einem 24 Jahre alten Standard entsprechen? Oder gar Systemen,
die gar keinem Standard entsprechen?

Die Typen uint8_t, sint8_t müssen außerdem nicht existieren. Es gibt
Systeme, auf denen so kleine Einheiten nicht effizient ansprechbar sind
und daher der C-Compiler keinen Typ dafür zur Verfügung stellt. Ich habe
z.B. mal Software für einen Signalprozessor geschrieben, der nur einen
32-Bit Integer-Typ hatte: CHAR_BIT war 32 und sizeof(char)==sizeof(int)
==sizeof(long)==1. Wenn Du einen vorzeichenlosen Integer-Typ mit
mindestens 8 Bit haben willst, nimm uint_least8_t oder uint_fast8_t. Die
beiden Typen muss es geben (und in den allermeisten Fàllen haben sie
wohl 8 Bit, aber in seltenen Fàllen vielleicht 9, 12, 16 oder 32 Bit).

hp


_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel

Ähnliche fragen