Diskussion:Datentypen in C

Letzter Kommentar: vor 4 Jahren von 84.55.243.164 in Abschnitt printf() in Character

printf() in Character

Bearbeiten
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 einem int umwandelt, bei einem Aufruf einer Funktion mit variablen Argumenten, sofern CHAR_MAX<INT_MAX. Ist CHAR_MAX==INT_MAX, ist es egal da dann beide Typen identisch sind. Im falle dass CHAR_MAX>INT_MAX, was sein kann wenn char unsigned ist, spielt es auch keine rolle da in so einem Fall char gleich gross ist wie int, 'A' in beiden Typen dargestellt werden kann und signed und unsigned 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)Beantworten

Character - Wertebereich

Bearbeiten

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))Beantworten