Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.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编程-意外输出_C_Casting_Output - Fatal编程技术网

C编程-意外输出

C编程-意外输出,c,casting,output,C,Casting,Output,我无法理解以下代码是如何工作的: #include<stdio.h> int main() { int i = 100; int *a = &i; float *f = (float *)a; (*f)++; printf("%d", *a); //getting some garbage value } #包括 int main(){ int i=100; int*a=&i; 浮点数*f=(浮点数*)a; (*f)++; printf(“%d”,*a)

我无法理解以下代码是如何工作的:

#include<stdio.h>

int main() {

 int i = 100;
 int *a = &i;
 float *f = (float *)a;

 (*f)++;

 printf("%d", *a); //getting some garbage value

}
#包括
int main(){
int i=100;
int*a=&i;
浮点数*f=(浮点数*)a;
(*f)++;
printf(“%d”,*a);//获取一些垃圾值
}

“f”指向与“a”相同的内存位置。因此,
(*f)+
应该依次将i的值增加到101。哪里出错了?

浮点和整数以不同的二进制表示形式存储。当您将
float
转换为
int
或反之亦然时,编译器会为您处理此问题。但是在您的例子中,您正在将
int*
强制转换为
float*
,因此您正在修改一个具有错误值的float,因为二进制表示没有转换。

此程序的行为在很大程度上取决于
float
在内存中的表示方式(很可能是根据IEEE 754)。首先,正式答案是,您所做的违反了严格的别名规则(即,
f
指向的位置中没有
float
,因此访问
*f
是非法的)。因此,您的程序的边界是未定义的,它可以做任何事情带有
char*f=(char*)a,则输出为101。为什么在这种情况下没有出现任何问题?因为
char
基本上只是
int
的一个子集,并且以相同的方式存储,但是
float
是完全不同的。