저는 8 바이트를 포함하는 바이트 배열을 가지고 있으며이를 변환하여 배정도 이진 부동 소수점 숫자로 사용하고 싶습니다.C에서 바이트 배열을 double로 변환하는 방법은 무엇입니까?
누군가 변환 방법을 알려주시겠습니까?
저는 8 바이트를 포함하는 바이트 배열을 가지고 있으며이를 변환하여 배정도 이진 부동 소수점 숫자로 사용하고 싶습니다.C에서 바이트 배열을 double로 변환하는 방법은 무엇입니까?
누군가 변환 방법을 알려주시겠습니까?
이 시도 : ptr
이 바이트 배열에 대한 포인터입니다
double a;
memcpy(&a, ptr, sizeof(double));
. 복사를 피하려면 유니언을 사용하십시오. C++에서
union {
double d;
char bytes[sizeof(double)];
} u;
// Store your data in u.bytes
// Use floating point number from u.d
: C++ 11에서
#include <string.h>
/* ... */
memcpy(&x, buf, sizeof(double));
, 당신은 또한 포함 (경계로 std::begin(buf)
및 std::end(buf)
를 사용할 수 있습니다 C에서
double x;
char buf[sizeof(double)]; // your data
#include <algorithm>
// ...
std::copy(buf, buf + sizeof(double), reinterpret_cast<char*>(&x));
헤더 <iterator>
), 두 언어 모두에서 다음을 사용할 수 있습니다. sizeof(buf)/sizeof(buf[0])
(또는 간단하게 sizeof(buf)
) 크기는 모두 buf
입니다. 실제로는 포인터가 아니라 배열입니다.
d = *((double *) buf);
피할 수 없을시 : 추천 용액 것을
double d = 0;
unsigned char buf[sizeof d] = {0};
memcpy(&d, buf, sizeof d);
참고
여기 memcpy
함수를 사용하여 하나의 해결책이다. 정렬 및 앨리어싱 규칙을 위반할 수 있으므로 정의되지 않은 동작입니다.
+1은 일반적인 접근 방법이 안전하지 않으며 ** 두 가지 ** 이유로 UB를 호출 함을 지적합니다. –
@R : 사실은 하나의 * reason * (즉 "표준이 그렇게 말하기 때문에")이지만 무모한 주조로 인해 발생할 수있는 실제 함정을 아는 것이 좋습니다. –
+1은 'sizeof d'를 사용합니다. :) – unwind
노조를 사용하십시오. –
@Paul : 사실 지금까지 가장 좋은 대답은 여기까지입니다. –
@PaulTomblin, 아마도이 모든 사람들은이 특정 집단에 대한 노조와 저항을 형성해야한다고 주장합니다. 정의되지 않은 동작을 사용합니다. – avakar