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:
?
"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:
?
"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:
?
 
			
					
				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 

 
			
					
				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.
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:
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);