잘못된 결과를 출력하는 코드가 있습니다.memcpy가 수행하지 않는 것 같습니다.
#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;
}
I가 얻을 출력
바이트 0xC0000000과 플로트 -2.000001e + 00
내가
이 이바이트 -6.2598534e을 떠을 0xdeadbeef
얻을 것으로 기대하고있다 +18,210
편집 # 1 지적되었을 때 엔디안 -1.1802469e은 내가 이해할 수없는 것은 29
입니다 + 떠 0xefbeadde 다음
바이트 초래할 것이다 다를 수 있습니다 float에서 unsigned int로 변환하여 0xc0000000이됩니다 (동일한 printf 문에서 부동 소수점이 -2.0000이되면 컴파일러 최적화에 영향을 미칩니다)
다른 컴퓨터에서 이전에 작동했습니다. 아키텍처 변화 일 수 있습니다.
은 16 진수 부분의 printf 문제라는 것을 인식하지 못했습니다. 플로트가 제대로 두 번 캐스팅되지 않았 음을 이해하지 못합니다. – Tanj
float를 double로 캐스팅하는 것이 4 바이트를 오른쪽으로 이동하는 것 이상입니다. 변환으로 float에서 3.14가 3.14를 두 배로 만듭니다. 그리고 판촉을 두 번 올린 후 printf()는 4 바이트를 전달합니다. 여기에서 % x은 2 바이트를 기대합니다. 따라서 % x 이후의 모든 것은 기지 밖입니다. – Andomar