Frage zum "Rechnen" mit char



  • auf allen x86 kompatiblen System ist es 8 Bit.

    ob signed oder unsigned hängt von der Compilereinstellung ab.
    bei VC++ is default signed.

    kurz: char reicht von -128 bis 127
    und unsigned char von 0 bis 255.

    ansonsten kannst du, wie schon von meinen Vorrednern erwähnt, mit chars genau so rechnen, wie mit ints, shorts und longs...



  • Ist es denn auch schneller? Weil bisher konnte ich keinen Geschwindigkeitsvorteil erkennen



  • Enlong schrieb:

    Ist es denn auch schneller? Weil bisher konnte ich keinen Geschwindigkeitsvorteil erkennen

    wieso sollte es?



  • hm, weil man nur 1/4 der Bits berabeiten muss? 🙂



  • Enlong schrieb:

    Ist es denn auch schneller? Weil bisher konnte ich keinen Geschwindigkeitsvorteil erkennen

    Nein, dein 32-Bit Rechner rechnet lieber mit 4Byte, statt mit Einem.



  • Es gibt 3 verschiedene Character-Typen: char, signed char, unsigned char.

    signed char kann mindestens Zahlen aus dem Bereich -127...127 darstellen
    unsigned char kann mindestens Zahlen aus dem Bereich 0...255 darstellen

    Der Typ char ähnelt entweder signed char oder unsigned char. Das ist aber Abhängig von der Implementierung.

    Siehe Integer Types in C and C++

    Zusätzlich zu den C-Makros in <climits> gibt es noch die Traits-Klasse std::numeric_limits<> in <limits>, über die man Implementierungsdetails erfragen kann.

    Und wenn die Rede von einem "Byte" ist, muss das nicht unbedingt ein "Oktett" sein.

    Gruß,
    SP



  • @Sebastian Pizer

    -> -128 bis 127 😉



  • DrakoXP schrieb:

    @Sebastian Pizer
    -> -128 bis 127 😉

    Was soll mir das sagen?

    Tipp: Wenn Du glaubst, der Standard garantiere, signed char könne -128 halten, dann irrst Du Dich. Der Standard erlaubt auch andere Formen der Repräsentierung von vorzeichenbehafteten Ganzzahlen. Genauer: Zweierkomplement, Einerkomplement und Sign+Magnitude. Du kannst Dich also nicht einmal darauf verlassen, dass ~(-1)==0 gilt. Bei 8 Bits und Einerkomplement oder Sign+Magnitude ist -127 die kleinste Zahl, die darstellbar ist. Wenn Du eine beliebige Zahl zu einem signed [char,short,int,long] konvertierst, ist das Ergebnis nur wohldefiniert, wenn der Typ die Zahl auch darstellen kann. Der andere Fall ist implementierungsabhängig.

    Worauf Du Dich verlassen kannst, ist, dass wenn Du eine beliebige Zahl x zu einem unsigned |char,short,int,long] y konvertierst, dass dann x = y mod 2^N gilt, wobei N die Anzahl der Bits in y ist.

    Gruß,
    SP



  • DrakoXP schrieb:

    auf allen x86 kompatiblen System ist es 8 Bit.

    Nein, auch darauf darfst Du dich nicht verlassen! Die Größe von char hängt vom jeweiligen OS ab, und daher muß man das vorher überprüfen.



  • ~john schrieb:

    DrakoXP schrieb:

    auf allen x86 kompatiblen System ist es 8 Bit.

    Nein, auch darauf darfst Du dich nicht verlassen! Die Größe von char hängt vom jeweiligen OS ab, und daher muß man das vorher überprüfen.

    Oh, da muß ich jetzt aber jede Menge Software reparieren. Damits schneller geht, kannste mal kurz aufzählen, welche Betriebssysteme Dir so geläufig sind, wo ein Byte nicht 8 Bit hat?



  • I sense great amounts of irony in here...



  • volkard schrieb:

    Oh, da muß ich jetzt aber jede Menge Software reparieren. Damits schneller geht, kannste mal kurz aufzählen, welche Betriebssysteme Dir so geläufig sind, wo ein Byte nicht 8 Bit hat?

    Es geht mir darum, daß es so etwas wie die ISO Norm für C und C++ existieren. Wenn man annimmt, daß ein char exakt 8Bit groß ist, dann muß man das OS genauer spezifizieren. Im Falle der Single UNIX Spec (in Teilen ebenfalls eine ISO Norm) ist ein char immer 8bit groß. Bei Windows dürfte es ebenfalls so sein. Aber das ist keine allgemeingültige Aussage.



  • ~john schrieb:

    P.S. Es gibt da draußen OS bei denen die unteren 7Bit in einem char nicht ASCII kodiert sein. Und diese Rechner sind keine Exoten.



  • hat sich erledigt.


Anmelden zum Antworten