转换之间的数据丢失

Ale*_*oks 3 c++ casting type-conversion

为什么我在下面的转换之间丢失数据,即使两种类型占用相同的空间量?如果按位完成转换,x = z除非在转换过程中剥离数据,否则应该是正确的,对吗?有没有办法在不丢失数据的情况下进行两次转换(即这样x = z)?

main.cpp中:

#include <stdio.h>
#include <stdint.h>

int main() {
    double   x = 5.5;
    uint64_t y = static_cast<uint64_t>(x);
    double   z = static_cast<double>(y) // Desire : z = 5.5;

    printf("Size of double: %lu\nSize of uint64_t: %lu\n", sizeof(double), sizeof(uint64_t));
    printf("%f\n%lu\n%f\n", x, y, z);
}
Run Code Online (Sandbox Code Playgroud)

结果:

Size of double: 8
Size of uint64_t: 8
5.500000
5
5.000000
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 10

转换不是按位的.

第一次转换值转换为无符号整数:

uint64_t y = static_cast<uint64_t>(x);  // y == 5
Run Code Online (Sandbox Code Playgroud)

第二个取整数,并将转换为相同值的double

double   z = static_cast<double>(y) // Convert 5 to 5.0
Run Code Online (Sandbox Code Playgroud)

类型使用相同数量的内存这一事实无关紧要,因为static_cast更改了类型.如果您从a转换为then,则会看到相同的行为uint32_t.它不仅仅执行按位转换.

如果要执行按位转换,可以通过指针操作执行此操作:

double   x = 5.5;
uint64_t y = *((uint64_t*)&x);  // Will effectively be a "garbage" value
double   z = *((double*)(&y)); // Will be 5.5
Run Code Online (Sandbox Code Playgroud)