Ich bin in Bezug auf die folgende Codezeile durch ein E-Mail-Argument zu lesen:Gibt ANSI C tatsächlich an, welche Bytes beim Typisieren auf eine kleinere Ganzzahl verwendet werden?
p = (unsigned char)random();
Die Zufallsfunktion eines lange zurückkehrt, und jemand sagt, dass dies nicht sicher ist, weil es möglich ist, dass die Typumwandlung den MSB könnte nehmen statt das LSB. Ich weiß, dass die Typumwandlung auf x86 LSB zurückgeben würde, aber ich kann keine Information darüber finden, ob dies tatsächlich von ANSI C vorgeschrieben ist oder ob es eines dieser implementierungsspezifischen "undefinierten Verhaltensweisen" ist.
Die Frage ist interessant und die Antwort wissenswert, aber im echten Code sollte man danach streben, Verwirrung zu beseitigen. Mit anderen Worten, wenn Sie den Code zu diesem ändern, gibt es keine Frage darüber, welches Byte verwendet wird: 'p = (unsigned char) (random()% 256)'. Dies wird verhindern, dass sich zukünftige Leser Ihres Codes dasselbe fragen. In der Regel sollten Sie keinen Code schreiben, der auf detaillierten Kenntnissen der zu verarbeitenden Standards beruht. –
In der Tat ist die Besetzung nicht notwendig; Sie können jedem beliebigen numerischen Typ einen beliebigen numerischen Typ zuweisen, und dieser wird implizit wie von einer Umwandlung konvertiert. –
@KeithThompson: Compiler können warnen, wenn eine potenziell verlustbehaftete Konvertierung ohne Umwandlung verwendet wird, obwohl ... – Christoph