C 将void指针强制转换为float*/int时取消引用* A. B
为什么打印0.0而不是10.0?如果我们将A改为B,那么它的输出就是垃圾。因为在第一种情况下,您并没有真正执行强制转换——您正在强制转换指针类型 如果您想要10.0,以下是您的方法:C 将void指针强制转换为float*/int时取消引用* A. B,c,C,为什么打印0.0而不是10.0?如果我们将A改为B,那么它的输出就是垃圾。因为在第一种情况下,您并没有真正执行强制转换——您正在强制转换指针类型 如果您想要10.0,以下是您的方法: float i=10.00; void *p = &i; // no change printf("%d\n", *(int*)p); 以下是您现在正在做的事情: int i = 10; printf("%f\n", (float)i); 由于int和float具有不同的表示形式,因此没有理由相信这会起
float i=10.00;
void *p = &i; // no change
printf("%d\n", *(int*)p);
以下是您现在正在做的事情:
int i = 10;
printf("%f\n", (float)i);
由于
int
和float
具有不同的表示形式,因此没有理由相信这会起作用。基本上,您所做的是将void*
转换为float*
/int*
,也就是说,您正在转换指针类型,然后取消对它们的引用。由于解引用操作的行为因类型而异,因此没有理由相信这会起作用。您可以尝试此代码并查看差异:
int i = 10; // Create int i and initialize to 10.
void *p = &i; // Get an untyped pointer and set it to the address of i
printf("%f\n", *(float*)p); // Treat the pointer p as a float pointer and dereference it, printing it as a float.
更准确地说,其他人说了什么,这里有一个测试:
int i = 10;
void *p = &i;
printf("%d\n", *(int*)(p));
这表明:
a) 这是一个小小的endian机器,因为int的最低字节在内存中排在第一位
b) int的表示形式是字节0A000
,因此值是0000000a
,十六进制表示形式是10。
c) 浮动确实是41200000
。根据,这意味着你有一个符号位,8个指数位和23个尾数位。符号为0(+),指数为0x82
,表示+3,尾数为010000…
,表示二进制的1.01或十进制的1.25
这些数据一起构成值2*2*2*1.25=8*1.25=10。
float
和int
在二进制级别上有不同的表示。你为什么希望这样做?你可以看看这个只是打印垃圾的东西,有很好的理由——你正在将一个空指针的地址转换为一个浮点指针,并取消对它的引用。问题a部分完全没有区别。此外,指针转换是未定义的行为,因此程序可能会崩溃和烧坏,而不仅仅是打印垃圾。我想这取决于int和float的大小。如果相同的代码将使用double而不是float,则更可能发生崩溃。请详细说明。!!为什么指针强制转换是未定义的行为??程序并没有崩溃,即使我们将它转换为双指针,它仍然给出相同的答案。。
int i = 10;
void *p = &i;
printf("%d\n", *(int*)(p));
#include <stdlib.h>
int main()
{
int a = 10;
float b = 10;
char * p;
p = &a;
printf("int repr: %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
p = &b;
printf("float repr: %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
return 0;
}
int repr: 0a 00 00 00
float repr: 00 00 20 41