Seite 1 von 4

Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 9:37 am
von mfro
Um nicht weiter anderer Leute Freds mit meinen spinnerten Rätselchen zu verschmutzen. "Idiosyncracy" - eins meiner Lieblingsworte in Englisch. Bedeutet "Eigenart", aber hier gefällt mir - ausnahmsweise - das englische Wort deutlich besser. Da erkennt man gleich, daß es um irgendwas (zumindest leicht) krankes geht ;).

Was kommt wohl da raus:

Code: Alles auswählen

printf(" %d\n", sizeof 'A' );
?

"1", ist doch klar, oder? Oder nicht?

Edit by Xin: Betreff erweitert

Re: Cidiosyncracies

Verfasst: Di Feb 18, 2014 10:03 am
von Xin
Richtig.

Wahrscheinlich...
Nach aktuellem Standard könnte ein char auch größere Werte besitzen als 8 bit repräsentieren, würde damit aber die Größe von "byte" verändern.
Spannend wird es, wenn char 32 Bit groß ist, was dann 1 Byte wäre. Die Frage ist dann wie groß int8_t ist. Vermutlich ebenfalls 32 Bit.

Ich könnte mir vorstellen, dass sich der Standard hier nochmal weiterentwickelt, z.B. um UTF besser zu unterstützen. In dem Fall hat sizeof 'A' Vorteile, da man nicht alle mallocs auf die veränderte Größe durchsuchen muss.

Du hast nach aktuellem Standard absolut recht und wahrscheinlich wirst Du mit 1 nie Probleme haben. Mit sizeof char dokumentierst du aber besser was Du eigentlich berechnest und liegst auch richtig, wenn char auf einem OS verwendet wird, das ausschließlich UTF-16 verwendet.

Re: Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 10:07 am
von nufan
mfro hat geschrieben:

Code: Alles auswählen

printf(" %d\n", sizeof 'A' );
?

"1", ist doch klar, oder? Oder nicht?
Ohne es ausprobiert zu haben... in C kommt 4 raus, in C++ 1? Oder wars umgekehrt? ^^

Re: Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 10:26 am
von cloidnerux
Die Lösung ist ganz klar Pi, oder 42.

Re: Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 10:28 am
von mfro
Daß da nicht "1" rauskommt, war ja nach der Überschrift schon klar ;).
dani93 hat geschrieben:Ohne es ausprobiert zu haben... in C kommt 4 raus, in C++ 1?
Völlig korrekt (falls sizeof(int) == 4 auf deiner Maschine). Aber warum?

... und was kommt hier raus:

Code: Alles auswählen

const char c = 'A';
printf(" %d\n", sizeof c);
?

Re: Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 10:31 am
von nufan
mfro hat geschrieben:Daß da nicht "1" rauskommt, war ja nach der Überschrift schon klar ;).
dani93 hat geschrieben:Ohne es ausprobiert zu haben... in C kommt 4 raus, in C++ 1?
Völlig korrekt (falls sizeof(int) == 4 auf deiner Maschine). Aber warum?
Weil in C Character-Literale noch vom Typ int sind. Ich kann mich erinnern mal einen Stackoverflow-Artikel gelesen zu haben, bei welchem Code ein C++ Compiler ein anderes Programm liefert als ein C Compiler, beim gleichen Code.

EDIT:
http://stackoverflow.com/questions/1288 ... en-compile

Re: Sizeof 'A' (war Cidiosyncracies)

Verfasst: Di Feb 18, 2014 10:51 am
von Xin
Hihi... wenigstens habe ich auf sizeof char gewechselt, dann ist die Aussage nicht ganz so daneben :-D

Cidiosyncracies

Verfasst: Di Feb 18, 2014 12:00 pm
von mfro
"Cidiosyncracies" war schon eine mit Bedacht gewählte Überschrift, ich hab' nämlich noch mehr von den Dingern:

Code: Alles auswählen

#include <stdio.h>

int main(int argc, char *argv[])
{
    const char c = 0xff;

    printf("0x%02x\n", c);
}
Was kommt denn wohl dabei raus? "0xff"?
Bestimmt nicht, sonst gäb's ja diesen Beitrag nicht ;).

Aber was? Und warum?

Re: Cidiosyncracies

Verfasst: Di Feb 18, 2014 8:01 pm
von nufan
mfro hat geschrieben:

Code: Alles auswählen

#include <stdio.h>

int main(int argc, char *argv[])
{
    const char c = 0xff;

    printf("0x%02x\n", c);
}
Was kommt denn wohl dabei raus? "0xff"?
Bestimmt nicht, sonst gäb's ja diesen Beitrag nicht ;).

Aber was? Und warum?
Jettzt wirds verwirrend ^^ Ich schätze mal es hat damit zu tun, dass das char -1 ist, dann in ein int umgewandelt und das Zweierkomplement ergänzt wird. Aber warum?!

Re: Cidiosyncracies

Verfasst: Di Feb 18, 2014 8:42 pm
von mfro
dani93 hat geschrieben:
mfro hat geschrieben:

Code: Alles auswählen

#include <stdio.h>

int main(int argc, char *argv[])
{
    const char c = 0xff;

    printf("0x%02x\n", c);
}
Was kommt denn wohl dabei raus? "0xff"?
Bestimmt nicht, sonst gäb's ja diesen Beitrag nicht ;).

Aber was? Und warum?
Jettzt wirds verwirrend ^^ Ich schätze mal es hat damit zu tun, dass das char -1 ist, dann in ein int umgewandelt und das Zweierkomplement ergänzt wird. Aber warum?!
c ist (auf Maschinen, auf denen der Typ char signed ist, das ist nicht immer so) 0xff, also -1, richtig.

Code: Alles auswählen

int printf(const char *format, ...);
Printf() ist eine variadische Funktion. Bei variadischen Funktionen findet für die "..."-Parameter immer eine Typpromotion, in diesem Fall also "int promotion" statt - im printf()-Rumpf landet also ein int mit dem Wert -1 (0xffffffff).

Das Format im printf()-Formatstring ist zwar auf zwei Zeichen festgelegt, der Standard verlangt aber, daß Formatstrings die Ausgabe nicht abschneiden dürfen, wenn der auszugebende Wert nicht ins Format paßt. "(int) -1" in Hexadezimaldarstellung ist nun mal 0xffffffff, paßt also nicht.

Ausgegeben wird konsequenterweise "0xffffffff".

Nicht unbedingt, was man sich so auf Anhieb denkt, aber völlig standardkonform ;).

Merke: wenn man Bytes (z.B. aus char-Arrays) in hex ausgeben will, muß man:

Code: Alles auswählen

printf("%02x ", c & 0xff);
schreiben! ;)

Dann kann jetzt sicher jemand die Preisfrage beantworten: wie lautet die Ausgabe: "0xffffffff 0xff" oder "0xff 0xff"?

Code: Alles auswählen

const unsigned char c = 0xff;
printf("%02x %02x\n", c, (char) c);