Schnelle Programmierfrage C

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Schnelle Programmierfrage C

      Moin,
      mal noch bisschen DS knowledge benutzen:
      Habe hier für HAs ne Funktion in C vor mir:
      void unpackData(unsigned char *buffer, unsigned int *a, unsigned int *b)
      {
      *a = (buffer[0]<<8) | buffer[1];
      *b = (buffer[2]<<8) | buffer[3];
      }
      Und ich soll jetzt ne entsprechende Funktion packData() schreiben,
      die zwei unsigned integer a,b eben in ein unsigned char buffer[4] packt.

      So zur eigentlichen Frage:
      Ist (buffer[0]<<8) nicht = 0?? char hat doch nur 8 bit oder? Und damit (buffer[0]<<8) | buffer[1] = buffer[1] ?
      Ergibt aber irgendwie keinen Sinn, was überseh ich?

      lg
    • Schon lange kein C mehr gemacht aber wenn ich das richtig verstehe ist das so:
      zum bsp. buffer[0] = 10000001 und buffer[1] = 10101010
      buffer[0]<<8 = 1000000100000000
      buffer[0]<<8 | buffer[1] = 1000000110101010

      Du machst quasi aus zwei 8bit zahlen eine 16bit zahl
    • pierakor schrieb:

      Schon lange kein C mehr gemacht aber wenn ich das richtig verstehe ist das so:
      zum bsp. buffer[0] = 10000001 und buffer[1] = 10101010
      buffer[0]<<8 = 1000000100000000
      buffer[0]<<8 | buffer[1] = 1000000110101010

      Du machst quasi aus zwei 8bit zahlen eine 16bit zahl

      Mhja danke das würde auf jeden Fall Sinn ergeben,
      aber ich dachte immer,dass das höchste Bit verworfen wird wenn es nach links geshifted wird, und da char nur 8 bit hat,
      ist das merkwürdig.

      edit: siehe msdn.microsoft.com/en-us/library/f96c63ed%28v=vs.80%29.aspx , "The result of a shift operation is undefined if the second operand is
      negative, or if the right operand is greater than or equal to the width
      in bits of the promoted left operand.".
    • pierakor schrieb:

      Eigentlich sollte "x<<8" und "x*256" genau gleich funktionieren. Und beim multiplizieren mit 256 wird auch nichts weggeworfen.
      Ja also was du geschrieben hast, wird auch sicher die Funktionalität der Funktion sein,
      aber jede Quelle die ich lese(z.B. oben editierte) sagt, dass << bzw. >> nicht über die Länge des Datentyps hinausverschiebt,
      sondern dann eben verwirft, darum ist mir das ganze nicht so richtig klar