首页 > 解决方案 > C/C++ 低级强制转换有什么作用?

问题描述

有人告诉我,类型转换 C 转换只会改变系统解释信息的方式(例如,转换char 'A'成in在使用打印时int会返回,因为在内存中它保持为)。65cout01000001

但是,我注意到,当将浮点数转换为相同宽度的整数时,该值是守恒的,不会改变,就像只改变解释一样。例如,设X一个双精度浮点数:

double X = 3.14159;

就我现在而言,在检查时&X我们会发现(由十进制转换为二进制转换器):

01000000 00001001 00100001 11111001 11110000 00011011 10000110 01101110

但是,正如你们中的一些人已经知道的那样,在执行以下操作时:

long long Y = (long long)X;

Y将是3的截断版本X,而不是在查找4614256650576692846二进制值时将获得的值。&Xlong long

所以,我认为很明显他们错了,但是,低级别的铸造如何工作?是否检测到该值是否会更改?您将如何对其进行编码以获取Y = 4614256650576692846而不是Y = 3

标签: c++ccastingtype-conversionlow-level

解决方案


铸造将尝试尽可能精确地保留值。您可以使用memcpy()来复制位模式。

#include <iostream>
#include <cstring>

int main() {
    double X = 3.14159;
    long long Y;
    memcpy(&Y, &X, sizeof(Y));
    std::cout << Y << '\n';
    return 0;
}

推荐阅读