gpt4 book ai didi

c - C 中的指针和类型转换

转载 作者:行者123 更新时间:2023-11-30 15:45:43 25 4
gpt4 key购买 nike

假设我有以下 C 代码

#include<stdio.h>

int main()
{
float a=3.14;
char j= a;
printf("%d\n", j);
return 0;
}

输出:3(如预期)

现在假设我使用指针做同样的事情。

#include<stdio.h>

int main()
{
float a=3.14;
char *j= (char*)&a;
printf("%d\n", *j);
return 0;
}

输出:-61

现在为什么我得到的是-61而不是3

编辑从到目前为止的答案中,我了解到,由于 char (通常)的长度为 1 个字节,因此 char 指针仅选择第一个字节并给出 -61 而不是打印完整的 float 。

但是,这里编译器如何确定数据类型的大小,以便它知道必须在哪里停止打印。它是否由指针类型确定,就像到目前为止的答案所显示的那样?

但理想情况下,在编译的词法阶段,会创建符号表,并且当时也可以理解数据类型。

问题因此,如果我使用 char 指针对编译器说,“嘿,伙计!!只需打印您在我给出的 char 指针指向的位置找到的数据(类型)。”。然后,它应该将完整的 float 打印为编译器现在知道它是一个 float 。?

最佳答案

char *j= (char*)&a;

现在j指向a的第一个字节,它本身可能有四个字节长。

printf("%d\n", *j);

在这里,您将 a 的底层表示形式的第一个字节的值作为 int 传递。

根据 IEEE 754,这是 0x4048f5c3 的第一个字节(检查 here )。假设您的机器是小端字节序,您将得到0xc3。您的 char 已签名,因此您得到 0x100-0xc3 =61

<小时/>

至于您的编辑:您不会要求编译器打印指针指向的数据类型。编译器可以可靠地获得有关该地址内容的唯一信息是它具有的静态类型,即 char。 C 中没有对类型信息的运行时支持。

编译器可能偶然知道这个内存区域恰好是一个浮点(因为它很聪明和/或你给出了一个退化的例子),但是这个可能仅有助于警告和优化;这个相同的案例怎么样?

void foo(char* j)
{
printf("%d\n", *j);
}

// perhaps in a translation unit:

int main()
{
float a=3.14;
foo((char*)&a);
return 0;
}

在本例中,您明确要求他将此内存区域视为字符,因此它正是这样做的,并且没有任何警告。

关于c - C 中的指针和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18872873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com