Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换之间的数据丢失_C++_Casting_Type Conversion - Fatal编程技术网

C++ 转换之间的数据丢失

C++ 转换之间的数据丢失,c++,casting,type-conversion,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);

为什么我会在下面的转换之间丢失数据,即使这两种类型占用相同的空间?如果转换是按位进行的,那么除非在转换过程中剥离数据,否则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);
}

转换不是按位进行的

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

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

有道理。那么是否有一种内置的方式来进行类型的位转换呢?或者我必须自己滚动转换器才能做这样的事情吗?@AlexBrooks不,没有。不过,你可以用指针来处理这个问题。好的,很好。你能提供一个如何使用指针进行转换的例子,这样我就知道我在正确的轨道上了吗?每当我尝试使用指针进行转换时,我都会收到错误,说明我正在执行无效的强制转换(
invalid static\u cast from type double*到type uint64\u t*{aka long unsigned int*}
invalid static\u cast from type uint64\u*{aka long unsigned int*}键入double*
)@AlexBrooks:你为什么要进行位转换?这是一个有趣的问题。你可能在这里找错了树。。。
uint64_t y = static_cast<uint64_t>(x);  // y == 5
double   z = static_cast<double>(y) // Convert 5 to 5.0
double   x = 5.5;
uint64_t y = *((uint64_t*)&x);  // Will effectively be a "garbage" value
double   z = *((double*)(&y)); // Will be 5.5