S
Stefan Reuther
Guest
Johannes Bauer wrote:
Auch bei der Konvertierung unsigned -> signed gilt das nicht, aber ich
wollte es nicht zu sehr ausarten lassen. Wichtig ist: wenn es passt,
wird der Wert kopiert (und nicht, wie behauptet, die Repräsentation).
"The memcpy function copies n characters ..." (ISO 9899:1999 7.21.2.1p2).
Einen void* kann man ja auch nicht dereferenzieren, er muss vor
Verwendung in einen anderen Typ gewandelt werden. Dieser andere Typ ist
halt ein Zeichentyp (char, unsigned char, signed char).
"implementation defined" heiĂt, der Compiler muss es definieren. Bei
"undefined" muss er nicht (darf aber).
Stefan
On 10.03.2015 11:31, Stefan Reuther wrote:
Unsinn. Ich muss nur wissen: wenn ich einen Wert habe, der in den neuen
Typ reinpasst, bleibt der erhalten. Wenn er nicht passt, wird bei
ganzzahligen Typen mod-2**n gerechnet, unabhängig von der Repräsen-
tation. (Nichts anderes drĂźckt der Standard in vielen Worten aus.)
Falsch!
Der Standard definiert solche Konversionen nur fĂźr unsignierte
Datentypen.
Auch bei der Konvertierung unsigned -> signed gilt das nicht, aber ich
wollte es nicht zu sehr ausarten lassen. Wichtig ist: wenn es passt,
wird der Wert kopiert (und nicht, wie behauptet, die Repräsentation).
Es gibt eine Ausnahme, die i.W. besagt, dass ein 'char*' auf alles
zeigen darf, und memcpy kopiert chars.
memcpy kopiert natĂźrlich keine chars:
void *memcpy(void *dest, const void *src, size_t n);
"The memcpy function copies n characters ..." (ISO 9899:1999 7.21.2.1p2).
Sondern hat im Prototyp void*, der nicht zu den von dir o.g.
aliasing-Problemen fĂźhrt.
Einen void* kann man ja auch nicht dereferenzieren, er muss vor
Verwendung in einen anderen Typ gewandelt werden. Dieser andere Typ ist
halt ein Zeichentyp (char, unsigned char, signed char).
gcc macht hier den Schritt nach vorne und definiert das Verhalten fĂźr
unions. Das darf er tun. "Der Compiler definiert" ist eine mĂśgliche
(aber halt nicht verpflichtende) Instanz von "der Sprachstandard lässt
undefiniert".
Das ist der Unterschied zwischen "implementation defined" und "undefined".
"implementation defined" heiĂt, der Compiler muss es definieren. Bei
"undefined" muss er nicht (darf aber).
Stefan