Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 为什么字体转换要从int打印浮动;0.0000“;_C_Pointers_Casting_Sizeof - Fatal编程技术网

C 为什么字体转换要从int打印浮动;0.0000“;

C 为什么字体转换要从int打印浮动;0.0000“;,c,pointers,casting,sizeof,C,Pointers,Casting,Sizeof,下面是我为理解类型转换而编写的一些代码,但我不理解为什么float或double的值被打印为“0.000000”,即使我从整数数组中键入类型转换或尝试从联合地址进行解释 #include <stdio.h> union test1 { int x; float y; double z; }; int main() { int x[2]={200,300}; float *f; f=(float*)(x); printf("%f\n",*f); /*(1)why i

下面是我为理解类型转换而编写的一些代码,但我不理解为什么float或double的值被打印为“0.000000”,即使我从整数数组中键入类型转换或尝试从联合地址进行解释

#include <stdio.h>

union test1
{
 int x;
 float y;
 double z;
};


int main()
{
 int x[2]={200,300};
 float *f;
 f=(float*)(x);
 printf("%f\n",*f); /*(1)why is this value 0.0*/

 *f=(float)(x[0]); /*(2)this works as expected and prints 200.00000*/
  printf("%f\n",*f);

  union test1 u;
  u.x=200;
  /*(3)this line give compilation error why*/
  //printf ("sizeof(test1) = %d \n", sizeof(test1));
  /*(4) this line also prints the value of float and double as 0.0000 why*/
  printf ("sizeof(test1) = %lu u.x:%d u.y:%f u.z:%lf \n", sizeof(u), u.x, u.y, u.z);
  return 0;
#包括
联合测试1
{
int x;
浮动y;
双z;
};
int main()
{
int x[2]={200300};
浮动*f;
f=(浮动*)(x);
printf(“%f\n”,*f);/*(1)为什么该值为0.0*/
*f=(float)(x[0]);/*(2)该函数按预期工作并打印200.00000*/
printf(“%f\n”,*f);
联合测试1 u;
u、 x=200;
/*(3) 这一行给出了编译错误的原因*/
//printf(“sizeof(test1)=%d\n”,sizeof(test1));
/*(4) 这一行还打印float和double的值为0.0000*/
printf(“sizeof(test1)=%lu u.x:%d u.y:%f u.z:%lf\n”,sizeof(u),u.x,u.y,u.z);
返回0;

}

首先,
int
float
是不兼容的类型

在你的代码中,说

 f=(float*)(x);
你在破坏秩序。任何进一步的用法都会调用

简单地说,你不能仅仅把一个指针指向一个
float
,把它转换成一个
int*
,然后取消对
int*
的引用,得到一个
int
值。引用

如果函数中的指针参数指向根本不同的类型,则假定它们不是别名,[…]

有关更详细的说明,请参阅已链接的常见问题解答

您正在获取
int
的地址,并将其视为包含
浮点
。这是未定义的行为

printf("%f\n",*f); /*(1)why is this value 0.0*/
这实际上是未定义的行为,但说这并不能解释为什么您的案例中有0.0。结果可能是任何东西,因为它是未定义的行为,但是对于给定的编译器和给定的机器,该行为虽然没有指定,但产生了一些东西

您正在以浮点形式读取包含int编码的内存;很可能将200编码为int,作为非常小的值(非规范化的小浮点数)读取为浮点数,并写入0.0。在我的机器上,使用printf将非规范化浮点数打印为0.0(不知道这是否是标准printf行为)


对于浮点编码,请阅读IEEE 754。

选择一种语言。不同的语言工作方式不同。标题上写着“0.0000”。帖子上写着“0.000000”。建议更改,使其符合您的真实体验。强制转换不会更改数据,它只会更改数据将被解释为的类型。在谷歌上搜索一下浮点数据(你选择的架构)是如何存储的,你可能会理解得更好一些。你正在做的是未定义行为(undefined behavior,UB)。使用
“%e”
将有助于更好地理解UB,但它仍然是UB。@mah:嗯。。。不是真的。强制转换可以很好地更改值的表示形式。对于一个指针,它是指针本身的值,而不是它所指向的数据的值,这就是这里的问题所在。C没有不同的C++类的操作符,如F=(浮点*)(和x);这也没什么区别,你能解释一下在你发布这个答案后编辑标签删除C++吗?罪过是指。无论如何,请注意,神圣C++标准不包含“严格混叠”一词。这完全是一个gcc概念,一个特殊的编译器。虽然它和标准的一段有着很强的联系。@Cheersandhth.-Alf:这是“我的过错”。正确的术语应该是“有效类型”,但标准中很好地提到了“别名”。与gcc关联的“严格别名”是与指针相关的另一个问题。注:这是关于C,而不是C++。@奥拉夫:你确定拉丁语中的问题很重要吗?沙德曼在这里解释了一下“链接答案,那是一个金矿。”
printf("%f\n",*f); /*(1)why is this value 0.0*/