Zwei 1 Byte Werte in einer 2 Byte Variable speichern



  • Braun-Bär Bruno schrieb:

    Tim schrieb:

    Janjan schrieb:

    Zu guter letzt ignorierst du jeglichen Aspekt der Endianess, sodass deine Shift-Richtung falsch sein kann.

    Selten so einen Unfug gelesen...

    Ja sicher... Hast du noch nie das Problem gehabt, dass die Beispiele
    in den Bücher mit Shiften anstelle einer Multiplikation mit
    2^n nicht funktionierten, weil die Endianess nicht berücksichtigt wurde...

    Nein, Tim hat recht. Ein links-shift um 1 entspricht immer einer Multiplikation mit 2. Das gilt für alle ganzzahligen Typen (char, short, int, long, ...) und deren vorzeichenlose Verwandten. Es spielt absolut keine Rolle, in welcher Reihenfolge die Bytes gespeichert werden.



  • Z schrieb:

    Nein, Tim hat recht. Ein links-shift um 1 entspricht immer einer Multiplikation mit 2. Das gilt für alle ganzzahligen Typen (char, short, int, long, ...) und deren vorzeichenlose Verwandten.

    1. Shifts auf negativen Zahlen sind implementierungsabhängig.
    2. Du tust so, als sei char vorzeichenbehaftet. char kann aber auch vorzeichenlos sein. Du weißt, dass es 3 char-Typen gibt, ja? char, signed char und unsigned char. Ob sich char sowie signed char oder wie unsigned char "verhält" (wertebereichstechnisch) ist nicht festgelegt.



  • short x;
    char a=56,b=199;
    char* p = (char*) &x;
    x[0]=a;
    x[1]=b;
    

    Ohne Garantie 😉 *scnr*



  • krümelkacker schrieb:

    Z schrieb:

    Nein, Tim hat recht. Ein links-shift um 1 entspricht immer einer Multiplikation mit 2. Das gilt für alle ganzzahligen Typen (char, short, int, long, ...) und deren vorzeichenlose Verwandten.

    1. Shifts auf negativen Zahlen sind implementierungsabhängig.
    2. Du tust so, als sei char vorzeichenbehaftet. char kann aber auch vorzeichenlos sein. Du weißt, dass es 3 char-Typen gibt, ja? char, signed char und unsigned char. Ob sich char sowie signed char oder wie unsigned char "verhält" (wertebereichstechnisch) ist nicht festgelegt.

    Probier mal das mit allen Compilern, die Dir zur Verfügung stehen:

    int main()  {
       char a = -3;
       signed char b = -3;
       unsigned char c = 3;
       printf ("%d %d %d\n", a<<1, b<<1, c<<1);  
    }
    

    Du bekommst immer -6, -6 und 6. Wollen wir wetten? 😉



  • Sorry...

    Hab wohl den falschen Smilie genommen...
    Das sollte ironisch sein...



  • Braun-Bär Bruno schrieb:

    Hab wohl den falschen Smilie genommen...
    Das sollte ironisch sein...

    Natürlich. Und der Text sollte eigentlich ein Geburtstagsgruß an Deine Großmutter werden. 😃



  • Braun-Bär Bruno schrieb:

    Sorry...

    Hab wohl den falschen Smilie genommen...
    Das sollte ironisch sein...

    Keine Sorge, ich habs so verstanden 🙂



  • Z schrieb:

    krümelkacker schrieb:

    Z schrieb:

    Nein, Tim hat recht. Ein links-shift um 1 entspricht immer einer Multiplikation mit 2. Das gilt für alle ganzzahligen Typen (char, short, int, long, ...) und deren vorzeichenlose Verwandten.

    1. Shifts auf negativen Zahlen sind implementierungsabhängig.
    2. Du tust so, als sei char vorzeichenbehaftet. char kann aber auch vorzeichenlos sein. Du weißt, dass es 3 char-Typen gibt, ja? char, signed char und unsigned char. Ob sich char sowie signed char oder wie unsigned char "verhält" (wertebereichstechnisch) ist nicht festgelegt.

    Probier mal das mit allen Compilern, die Dir zur Verfügung stehen:

    int main()  {
       char a = -3;
       signed char b = -3;
       unsigned char c = 3;
       printf ("%d %d %d\n", a<<1, b<<1, c<<1);  
    }
    

    Du bekommst immer -6, -6 und 6. Wollen wir wetten? 😉

    Sprich doch einfach aus, worauf Du hinaus willst. Ich halte es für wichtig, darauf hinzuweisen, was der Sprachstandard garantiert und was er nicht garantiert. Er garantiert nicht, dass char vorzeichenbehaftet ist. Er garantiert nicht, dass (-3<<1)==(-6) gilt. Er garantiert (noch) nicht, dass (-7/2)==(-3) gilt. Er garantiert nicht, dass (-1|2)==(-1) gilt, etc etc etc. Du bist scheinbar der Meinung, dass das nicht erwähnenswert ist.



  • krümelkacker schrieb:

    Ich halte es für wichtig, darauf hinzuweisen, was der Sprachstandard garantiert und was er nicht garantiert. Er garantiert nicht, dass char vorzeichenbehaftet ist. Er garantiert nicht, dass (-3<<1)==(-6) gilt.

    Ich denke schon, daß der Standard (-3)<<1 == -6 garantiert, sofern diese -3 ein Integer-Typ ist.
    Ich verwende C++ schon seit vielen Jahren und bisher bin ich von dieser wunderbaren Programmiersprache noch nicht enttäuscht worden. 😉



  • Z schrieb:

    krümelkacker schrieb:

    Ich halte es für wichtig, darauf hinzuweisen, was der Sprachstandard garantiert und was er nicht garantiert. Er garantiert nicht, dass char vorzeichenbehaftet ist. Er garantiert nicht, dass (-3<<1)==(-6) gilt.

    Ich denke schon, daß der Standard (-3)<<1 == -6 garantiert, sofern diese -3 ein Integer-Typ ist. Ich verwende C++ schon seit vielen Jahren und bisher bin ich von dieser wunderbaren Programmiersprache noch nicht enttäuscht worden.

    Und genau deswegen halte ich es für wichtig darauf hinzuweisen. Viele -- wie anscheinend Du auch -- gehen davon aus, dass dieses Verhalten garantiert ist.

    Im Entwurf des C++ Standards von 2005 kann man nachlesen:

    Shift Operators, §5.8/2-3:

    The value of E1 << E2 is E1 (interpreted as a bit pattern) left-shifted E2 bit positions; vacated bits are zero-filled. If E1 has an unsigned type, the value of the result is E1 multiplied by the quantity 2 raised to the power E2, reduced modulo ULONG_MAX+1 if E1 has type unsigned long, UINT_MAX+1 otherwise. [ Note: the constants ULONG_MAX and UINT_MAX are defined in the header <climits>. — end note ]

    The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided by the quantity raised to the power E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

    implementation-defined behavior, §1.3.6:

    behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation documents.

    Fundamental types, §3.9.1/1,7:

    [...] It is implementation-defined whether a char object can hold negative values. [...]

    [...] The representations of integral types shall define values by use of a pure binary numeration system. [ Example: this International Standard permits 2’s complement, 1’s complement and signed magnitude representations for integral types. — end example ]

    ==>

    |      -3      |   -3 << 1
    --------+--------------+------------------
    2's cmp | 111...111101 | 111...111010 (-6)
    1's cmp | 111...111100 | 111...111000 (-7)
    sgn+mag | 100...000011 | 000...000110 ( 6)
    

    Q.E.D.


Anmelden zum Antworten