Sizeof 'A' (war Cidiosyncracies)

Schnelle objektorientierte, kompilierende Programmiersprache.
mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Sizeof 'A' (war Cidiosyncracies)

Beitrag von mfro » Di Feb 18, 2014 9:37 am

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
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Cidiosyncracies

Beitrag von Xin » Di Feb 18, 2014 10:03 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Sizeof 'A' (war Cidiosyncracies)

Beitrag von nufan » Di Feb 18, 2014 10:07 am

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? ^^

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Sizeof 'A' (war Cidiosyncracies)

Beitrag von cloidnerux » Di Feb 18, 2014 10:26 am

Die Lösung ist ganz klar Pi, oder 42.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Sizeof 'A' (war Cidiosyncracies)

Beitrag von mfro » Di Feb 18, 2014 10:28 am

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);
?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Sizeof 'A' (war Cidiosyncracies)

Beitrag von nufan » Di Feb 18, 2014 10:31 am

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Sizeof 'A' (war Cidiosyncracies)

Beitrag von Xin » Di Feb 18, 2014 10:51 am

Hihi... wenigstens habe ich auf sizeof char gewechselt, dann ist die Aussage nicht ganz so daneben :-D
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Cidiosyncracies

Beitrag von mfro » Di Feb 18, 2014 12:00 pm

"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?
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Cidiosyncracies

Beitrag von nufan » Di Feb 18, 2014 8:01 pm

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?!

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Cidiosyncracies

Beitrag von mfro » Di Feb 18, 2014 8:42 pm

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);
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten