为什么我在下面的转换之间丢失数据,即使两种类型占用相同的空间量?如果转换是按位完成的,那么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
答案 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