Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将void指针强制转换为float*/int时取消引用* A. B_C - Fatal编程技术网

C 将void指针强制转换为float*/int时取消引用* A. B

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具有不同的表示形式,因此没有理由相信这会起

为什么打印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
具有不同的表示形式,因此没有理由相信这会起作用。

基本上,您所做的是将
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