Frage

Ich habe dieses Stück Code, der die falschen Ergebnisse ausgeben.

#include <stdio.h>
#include <string.h>

int main() 
{
  unsigned char bytes[4];
  float flt=0;

  bytes[0]=0xde;
  bytes[1]=0xad;
  bytes[2]=0xbe;
  bytes[3]=0xef;

  memcpy( &flt, bytes, 4);

  printf("bytes 0x%x float %e\n", flt, flt);
  return 0;
}

die Ausgabe, die ich erhalte, ist

  

Bytes 0xc0000000 float -2.000001e + 00

Ich erwarte bekommen

  

Bytes 0xDEADBEEF float -6.2598534e + 18

bearbeiten # 1 wie wurde die Endian anders sein könnte darauf hingewiesen, die in den folgenden

führen würde
  

Bytes 0xefbeadde float -1.1802469e + 29

, was ich nicht verstehe, ist die Besetzung von float zu unsigned int was 0xc0000000 (der Schwimmer in der gleichen Anweisung printf -2,0000 ist schreibe ich würde Optimierung Compiler)

Das war, bevor sie auf einem anderen Computer arbeiten. Es könnte eine Architektur Veränderung sein.

War es hilfreich?

Lösung

Es ist nicht Problem der memcpy.

  1. float ist immer, wenn sie über double von printf weitergegeben ... umgewandelt, so dass Sie nur 4 Bytes erhalten nicht auf die meisten Intel-Architekturen.
  2. , wenn Sie 0xdeadbeef in diesem Code expacting, Sie davon ausgehen, dass Ihre Architektur Big Endian ist. Es gibt viele kleine Endian-Architekturen, zum Beispiel Intel x86.

Andere Tipps

Sie erkennen, dass Schwimmer zu verdoppeln wird gefördert, wenn sie einen variablen Parameter wie printf Funktion () übergeben? Also, wenn Sie sagen:

printf("bytes 0x%x float %e\n", flt, flt);

Sie versuchen zu behandeln, was wirklich zwei 8-Byte-Werte wie zwei 4-Byte ist Werte, (glaube ich) nicht definiertes Verhalten zu geben.

Die "% x" in printf erwartet eine unsigned int. Sie geben ihm einen Schwimmer, der automatisch konvertiert wird immer und das ist nicht das, was Sie wollen. Sie wollen, wie etwas tun:

printf("bytes 0x%x float %e\n", *((unsigned int *)&flt), flt);

Oh, und wie jemand anderes darauf hingewiesen, wenn Sie auf x86 bist du bist nicht 0xDEADBEEF gehen, um zu sehen, mehr wie 0xefbeadde.

Sehen Sie, wenn dies besser:

printf("bytes 0x%x float %e\n", *(int *)&flt, flt);

den Parameter Förderung sieht die Erklärung von Schwimmer ändern zu verdoppeln. Auf meinem Rechner, die Drucke:

bytes 0xefbeadde float -1.860545e+230

Die 0xefbeadde ist Big-Endian für deadbeaf. Die letzten 4 Bytes des Doppel sind nicht definiert, so dass die Zahl nach dem Schwimmer angezeigt werden, variiert.

Sie haben erwähnt, es auf einem anderen Computer gearbeitet, welche Art von Computer war das? Must've kleine Endian gewesen, wo sizeof (float) == sizeof (double):)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top