gpt4 book ai didi

c - 为什么指针类型转换为 float 不起作用?

转载 作者:行者123 更新时间:2023-11-30 20:53:05 24 4
gpt4 key购买 nike

大家好,我正在学习 C,我正在尝试使用单个字符指针打印不同数据类型的值。我能够打印几乎所有数据类型,但在打印 float 时遇到问题。谁能解释为什么这是一个问题?我如何使用单个指针打印精确的浮点值。很抱歉这个菜鸟问题,如果事实证明是这样的话。我了解对齐问题。但确实需要一个解决方案。

更新 1--> 抱歉,我的打字很愚蠢。现在考虑更新代码。

更新2 --> 谢谢大家的回答。就像我说的,我正在学习 C,对于语法错误表示歉意。我不是CS背景。但再次非常感谢你。

    #include <stdio.h>

int main()
{
long int a = 10;
char ch = 'a';
float b = 16.89;
unsigned int c = 20;
short int d = 30;
char *p;
p = &a;
printf("Value of a: %d\n", *p);
p = &ch;
printf("Value of ch: %c\n", *p);
p = &b;
printf("Value of b(float): %f\n", *p);
printf("Value of b(decimal): %d\n", (int) *((float*)p));
p = &c;
printf("Value of c: %u\n", *p);
p = &d;
printf("Value of d: %i\n", *p);
return 0;
}

The output of the above program is :-
Value of a: 10
Value of ch: a
Value of b(float): 0.000000
Value of b(decimal): 16
Value of c: 20
Value of d: 30

最佳答案

这种工作是偶然的。 p 是一个 char 指针;所以 *p 始终是一个字符。

  • 您获取a的地址,将其转换为long int *。它已经是一个 long int *,因为您获取了一个 long int 的地址 - 所以这实际上并没有做任何事情。然后将其填充到 p 中,它是一个 char *。它不能在 char * 变量中保留为 long int *;现在它是一个 char *。现在,您显然正在使用 little-endian 的机器上架构,就像我们大多数人一样,所以最小字节优先:您的 long int a 表示为 [10, 0, 0, 0] *p 读取第一个字节。然后,C 的另一个特性开始发挥作用:所有小于 int 的整数参数都作为 int 传递;因此字节 10 被转换为 int 并推送到堆栈(或通过较新架构的 ABI 中的整数寄存器传递),然后由 printf 使用 %d 格式,需要 int

  • 对于char ch*p不会读取第一个字节,它只读取 em> 字节;其余的都一样。对于其余的整数类型也是如此,您很友善,永远不要超过 255 127 [谢谢,Antti Haapala!](否则您会看到意想不到的结果)。

    <
  • 但是,float b 却是另一回事。 float 在内存中的表示方式与整数非常不同。当 *p 读取第一个字节时,它得到与 16.89 完全无关的东西 - 有点像在观看万花筒时试图猜测一幅画。第一个字节扩展为 int 并传递给函数。在较旧的架构中,它会像 float 一样被读取,但在 current ABIs 中,其中最多四个 (MS) 或六个 (UNIX) 整型和浮点参数通过寄存器传递,甚至不会被查看(因为它是通过整型寄存器传递的,但是 %f将查看浮点寄存器)。请记住,这主要是因为您的指针最终成为 char *,这是由于您存储它的方式所致。

  • decimal(b)中,您做了一些非常不同的事情:您将指针转换到重要的地方。所以在这里,p 的值变成了一个 float * 位;然后你取消引用它,并正确地得到16.89;然后将其转换为 int,并最终得到 16(使用 %d 打印,所以一切都很好)。

tl;dr:C 变量的类型是一成不变的。您所做的任何转换仅在您不存储它们时才重要 - 一旦您将它们放入变量中,类型就是变量的类型。

关于c - 为什么指针类型转换为 float 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53202069/

24 4 0
文章推荐: c# - 用于获取分组表中具有最大日期的行的 LINQ 查询
文章推荐: javascript - 如何使用 JavaScript 在可编辑的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com