转换之间的数据丢失

时间:2013-06-28 16:17:39

标签: 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);
}

结果:

Size of double: 8
Size of uint64_t: 8
5.500000
5
5.000000

1 个答案:

答案 0 :(得分:10)

转换不是按位的。

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

uint64_t y = static_cast<uint64_t>(x);  // y == 5

第二个取整数,转换为相同值的两倍

double   z = static_cast<double>(y) // Convert 5 to 5.0

类型使用相同数量的内存这一事实无关紧要,因为static_cast更改了类型。如果从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