有人告诉我,C语言中的类型转换只会改变系统对信息的解释方式(例如,将字符型 'A' 转换为整型,使用 cout 输出该值时会返回 65,因为在内存中它仍保持为01000001)。
然而,我注意到当将浮点数强制转换为相同位数的整数时,其值是保留不变的,而不仅仅是改变了解释方式所导致的结果。例如,假设有一个双精度浮点数 X:
据我所知,在检查
然而,我注意到当将浮点数强制转换为相同位数的整数时,其值是保留不变的,而不仅仅是改变了解释方式所导致的结果。例如,假设有一个双精度浮点数 X:
double X = 3.14159;
据我所知,在检查
&X
时,我们将发现(通过十进制转二进制转换器进行转换):01000000 00001001 00100001 11111001 11110000 00011011 10000110 01101110
但是,正如你们中的一些人可能已经知道的那样,当进行以下操作时:
long long Y = (long long)X;
Y
将会是X
的截断版本3
,而不是4614256650576692846
。如果查找&X
的二进制值作为long long
,则会得到后者的值。
所以,我认为这很明显是错误的,那么,在低级别中转换是如何工作的呢?是否有检测是否更改值的功能?如何编码以获取Y = 4614256650576692846
而不是Y = 3
?
memcpy(&Y, &X, sizeof(Y));
- MikeCATchar
和int
的大小(几乎总是)不同,因此这不是编译器重新解释位的最佳示例。在常见情况下,编译器必须在将char
解释为int
之前逻辑上添加三个字节的数据。如果char
为负,则这些字节甚至可能不全为0。将该转换描述为创建具有与char
相同数值的int
更简单。 - chrislong long Y = X;
会做完全相同的事情。 - Pete Becker