【发布时间】:2020-10-28 13:33:35
【问题描述】:
有人告诉我,类型转换 C 转换只会改变系统解释信息的方式(例如,将 char 'A' 转换为 int 在使用 cout 打印时确实返回 65自从在
内存它保持为01000001)。
但是,我注意到,当将浮点数转换为相同宽度的整数时,该值是守恒的,不会改变,就像只改变解释一样。
例如,设X 为双精度浮点数:
double X = 3.14159;
就我现在而言,在检查&X 时,我们会发现(由decimal to binary converter 转换):
01000000 00001001 00100001 11111001 11110000 00011011 10000110 01101110
但是,正如你们中的一些人已经知道的那样,在这样做时:
long long Y = (long long)X;
Y 将是3,即X 的截断版本,而不是4614256650576692846,如果查找long long,则在查看&X 处的二进制值时将获得的值。
所以,我认为很明显他们错了,但是,低级别的演员如何工作?是否检测到该值是否会更改?您将如何编码以获取 Y = 4614256650576692846 而不是 Y = 3?
【问题讨论】:
-
所有演员表都不同。 这个演员改变了位。
-
memcpy(&Y, &X, sizeof(Y)); -
每当您觉得需要在您的 C++ 程序中进行 C 风格的类型转换时,您应该将其视为您做错了什么的标志。
-
char和int(几乎总是)不同的大小,因此这不是编译器只是重新解释位的最佳示例。在常见情况下,编译器必须在逻辑上将三个字节的数据添加到char,然后才能将其解释为int。如果char是负数,这些字节甚至可能不都是0。将这种转换描述为创建一个与char具有相同数值的int要简单得多。 -
演员阵容无关紧要。
long long Y = X;会做同样的事情。
标签: c++ c casting type-conversion low-level