c++ - C/C++ 低级强制转换有什么作用?
问题描述
有人告诉我,类型转换 C 转换只会改变系统解释信息的方式(例如,转换char
'A'
成in在使用打印时int
会返回,因为在内存中它保持为)。65
cout
01000001
但是,我注意到,当将浮点数转换为相同宽度的整数时,该值是守恒的,不会改变,就像只改变解释一样。例如,设X
一个双精度浮点数:
double X = 3.14159;
就我现在而言,在检查时&X
我们会发现(由十进制转换为二进制转换器):
01000000 00001001 00100001 11111001 11110000 00011011 10000110 01101110
但是,正如你们中的一些人已经知道的那样,在执行以下操作时:
long long Y = (long long)X;
Y
将是3
的截断版本X
,而不是在查找4614256650576692846
二进制值时将获得的值。&X
long long
所以,我认为很明显他们错了,但是,低级别的铸造如何工作?是否检测到该值是否会更改?您将如何对其进行编码以获取Y = 4614256650576692846
而不是Y = 3
?
解决方案
铸造将尝试尽可能精确地保留值。您可以使用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;
}
推荐阅读
- python - python将一列的内容复制到另一列
- variables - 如何在配置单元查询中使用嵌套变量替换
- database - TypeORM:迁移优先或实体优先
- python - 检查python脚本是否由jenkins触发
- css - 如何从上到下淡化图像?
- qt - 在 Windows 上通过 CMake 在 Qt 中构建开源项目(Mumble)
- python - 如何一次计算指定坐标和二维 xarray 数据之间的欧几里得距离
- node.js - 堆内存不足 - 增加 max-old-space-size 并不能解决问题
- .net - 使用 Simplemembership 在 .NET 应用程序中启用 Azure AD FS 的最简单方法
- rust - 处理实际数据而不关心数据如何被保护/包装的惯用方法是什么?