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)
| 归档时间: |
|
| 查看次数: |
1461 次 |
| 最近记录: |