Bitte helfen Sie mir bei der Verwendung von memcpy () in C

  • Ich habe den folgenden Code:

     void main()
    {
        char tmp[3]= "AB";
        short k;
        memcpy(&k,tmp,2);
        printf("%x\n", k);
    }
     

    In ASCII der Hex-Wert von Zeichen 'A' ist 41 und der Hex-Wert von Zeichen 'B' ist 42. Warum ist das Ergebnis dieses Programms 4241? Ich denke, das richtige Ergebnis ist 4142.

    22 November 2011
    James
3 answers
  • Sie betreiben dies anscheinend auf einer "Little-Endian" -Maschine, bei der das niedrigstwertige Byte an erster Stelle steht. Siehe http://en.wikipedia.org/wiki/Endianness .

    22 November 2011
    ruakhNiamh Doyle
  • Ihre Plattform speichert weniger signifikante Bytes einer Zahl in kleineren Speicheradressen und höherwertige Bytes in höheren Speicheradressen. Solche Plattformen werden als Little-Endian-Plattformen bezeichnet.

    Wenn Sie jedoch eine Zahl drucken, werden zuerst die höherwertigen Ziffern gedruckt, während die weniger signifikanten Ziffern gedruckt werden später (so funktioniert unsere numerische Notation im Alltag). Aus diesem Grund sieht das Ergebnis "umgekehrt" aus, verglichen mit der Art und Weise, wie es auf einer Little-Endian-Plattform im Arbeitsspeicher gespeichert wird.

    Wenn Sie dasselbe Programm auf einem Big-Endian -Plattform, sollte die Ausgabe 4142 sein (unter der Annahme, dass eine Plattform mit 2 Byte short ist).

    PS Man kann argumentieren, dass das "Problem" in diesem Fall die "Seltsamkeit" unserer alltäglichen numerischen Notation ist: Wir schreiben Zahlen, sodass die Bedeutung ihrer Ziffern von rechts nach links zunimmt. Dies scheint inkonsistent zu sein in Gesellschaften, die von links nach rechts schreiben und lesen. Mit anderen Worten, es ist nicht in der Little-Endian-Erinnerung umgekehrt. Es ist die Art, wie wir Zahlen schreiben, die umgekehrt sind.

    22 November 2011
    AnT
  • Ihr System ist Little Endian. Das bedeutet, dass eine short (16-Bit-Ganzzahl) zuerst mit dem niedrigstwertigen Byte gefolgt von dem höchstwertigen Byte gespeichert wird. Der folgende Code würde zu "44434241" führen.

     void main() 
    { 
        char tmp[5]= "ABCD"; 
        int k; 
        memcpy(&k,tmp,4); 
        printf("%x\n", k); 
    } 
     
    22 November 2011
    Andrew Cooper