在C中从int转换为float会更改值

Mar*_*arc 2 c casting

嗨,我正试图从一个转换int为一个float在C中,由于某种原因,演员改变了价值,我不知道为什么.所以:

fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
Run Code Online (Sandbox Code Playgroud)

产生两个不同的数字.请注意,这rgbValues->green是一个int.

知道为什么会这样吗?

谢谢

Ara*_*raK 10

你必须在你的格式字符串中说.使用:

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
                     ^
Run Code Online (Sandbox Code Playgroud)

代替:

fprintf(stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
                     ^
Run Code Online (Sandbox Code Playgroud)

请注意从更改df(抑扬符^不是代码的一部分,只是指向何处查看).

  • @Adam阅读评论. (2认同)
  • 你想去,希望能让所有人更加明白. (2认同)

Ada*_*eld 6

%d格式说明说来printf,"采取下一个4个字节从堆栈中,将其解释为一个整数,并打印出整." 由于您实际上是将a float作为参数传递,因此float(以IEEE-754格式存储)的字节被误解为整数,因此具有不同的值.(实际上,在变量函数中,它将float被转换为double由于参数提升,并且它被提升的前4个字节double被解释为整数.)

正确的解决方案是使用中的所述一个%e,%f%g代替格式说明%d打印出时float. %e说,"从堆栈中取出接下来的8个字节,将它们解释为a double,并使用科学(指数)表示法 %f打印出来"使用定点格式%g打印出来,并打印出较短的%e或者%f.

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
Run Code Online (Sandbox Code Playgroud)