Diskussion:Datentypen in C
printf() in Character
char zeichen = 'A'; /* intern gespeichert wird nicht der Buchstabe „A“ sondern
* die anhand der ASCII-Tabelle errechnete Binärzahl „01000001“ */
printf("%d", zeichen); /* gibt „01000001“ als Dezimalzahl aus, also: „65“ */
printf("%c", zeichen); /* gibt „01000001“ als ASCII-Zeichen aus, also: „A“ */
Aus dem Absatz "Character"
Da printf() eine Funktion mit variabler Anzahl an Argumenten ist und diese folglich mithilfe des Formatstrings Anzahl und den jeweiligen Datentyp ihrer Prameter am Stack bestimmt, wäre es bei diesem Code m.E. nach sinnvoll darauf hinzuweisen, dass mit einem Compiler der nicht automatisch zum größten Datentyp konvertiert Probleme entstehen können. Hier würden bei einem Integer mit 32 Bit nur acht davon vom Stack geholt und die andern 24 blieben darauf liegen.
- C hat eine Integer-Promotion die einen
char
zu einemint
umwandelt, bei einem Aufruf einer Funktion mit variablen Argumenten, sofernCHAR_MAX<INT_MAX
. IstCHAR_MAX==INT_MAX
, ist es egal da dann beide Typen identisch sind. Im falle dassCHAR_MAX>INT_MAX
, was sein kann wennchar
unsigned
ist, spielt es auch keine rolle da in so einem Fallchar
gleich gross ist wieint
,'A'
in beiden Typen dargestellt werden kann undsigned
undunsigned
beliebig ausgetauscht werden kann solange der Wert von beiden Typen darstellbar ist (siehe Fussnote 41 im C11 Standard). - Von dem her gibt es keinen Standardkonformen Compiler bei dem dieser Code probleme macht. --84.55.243.164 11:29, 21. Okt. 2020 (CEST)
Character - Wertebereich
Hallo,
Zitat: "(dadurch ergeben sich 256 verschiedene Werte, die einem Character zugewiesen werden können)" Das trifft leider nur aufs 2-er Komplement zu. Bei einem 1-er Komplement ergeben sich nur 255 Werte. C90 (und ich glaube auch C99) garantieren hier für einen signed char nur den Wertebereich -127 - +127, also 255 verschiedene Werte. (nicht signierter Beitrag von 2001:A62:1461:1601:6D9:F5FF:FEF5:72D5 (Diskussion) 20:46, 4. Okt. 2019 (CEST))