-2

위의 명령문을 참조하고 있습니다. 예상 출력은 두 배입니다. 내 문제와 관련있는 것을 찾지 못했습니다. 이 항목을 찾았습니다. Passing a structure through Sockets in C 해당 항목이 있으면 알 수 없습니다. 해당 int64 값을 읽지 않습니다. 나는 다른 과정에서 그것을 얻고 있는데 그것은 그것이 설계된 방식이다.각 직렬화되지 않은 64 비트 정수를 비트와 동등한 64 비트 부동 소수점 숫자로 변환해야합니다.

int의 직렬화 및 비 직렬화에 대한 이론을 갖고있는 사람이 있습니까?

+2

왜 당신이 직접로 데이터를 읽지 않는다'double'? – NathanOliver

+0

std :: memcpy가 대신 해드립니다. int64와 float의 결합은 UB입니다. –

+0

Nathan에게 감사드립니다. 나는 그 중 하나를 읽지 않았습니다. 나는 다른 과정에서 그것을 얻고 있는데 그것은 그것이 설계된 방식이다. –

답변

-3

64 비트 숫자를 읽고 reinterpret_cast를 사용하여 비트와 동등한 부동 소수점 숫자로 변환하는 방법은 어떻습니까?

int64_t a = 121314; 
double b = *reinterpret_cast<double*>(&a); 
int64_t c = *reinterpret_cast<int64_t*>(&b); 
assert(a==c); 
+1

감사하지만 C2440 오류가 발생하지 않습니다 : 'reinterpret_cast': 'int64_t'에서 'double'로 변환 할 수 없습니다 –

+0

나를 때려주십시오. –

1

C++의 또 다른에 - 비트 단위로 복사 한 종류를 정확히 하나의 정의 방법이 - memcpy가.

template<class Out, class In, std::enable_if_t<(sizeof(In) == sizeof(Out))>* = nullptr> 
Out mangle(const In& in) 
{ 
    Out result; 
    std::memcpy(std::addressof(result), std::addressof(in), sizeof(Out)); 
    return result; 
} 


int main() 
{ 
    double a = 1.1; 
    auto b = mangle<std::uint64_t>(a); 
    auto c = mangle<double>(b); 

    std::cout << a << " " << std::hex << b << " " << c << std::endl; 
} 

예 출력 :

1.1 3ff199999999999a 1.1 
+0

void * comp = & (x_double); 이중 성분 = (* (F64 *) comp); 나는 핵심 답변이 아닌 동일한 대답을 얻는다. 하지만 당신의 도움을 주셔서 감사합니다 –

+0

같은 대답을 얻을 수 있지만 C 스타일의 캐스트를 사용할 때의 행동은 표준에 의해 정의되지 않았습니다. –