我们有如下程序。
#include<stido.h>
int main()
{
float f=1.0000;
printf("%d",f);
}
根据我昨天写的内容,大家会不会认为这个结果是一
昨天的原文printf与数据结构
而真实结果是这样的
是不是有些出乎大家的意料。其实这也是必然的,因为浮点数与整数在内存中的编码方式是不一样的
这只是一个小坑。更大的坑在后面等着你们
#include <stdio.h>
int main()
{
float f = 1.0000;
int *i_point = NULL;
i_point = &f;
printf("%d", i_point);
getchar();
}
这个结果就会完全出乎大家的意料
当数据结构里面出现指针就会出现很多的问题
因为指针是直接操作地址的,出现这个结果的原因是浮点数是用IEEE编码进行存放的,具体详情大家可以去百度,在这里不对此编码进行详细讨论。
下面有一道题目,来计算一下里面的值
#include <stdio.h>
int main()
{
int num = 0xFFFFFFFF;
short *pNum = #
printf("%d\n", *pNum);
(*pNum) += 100;
printf("%d\n", *pNum);
printf("%d\n", num);
getchar();
}
第一个printf的值相信大家都知道,是-1,第二个值相信大家也能计算出来。为99。但是第三个printf打印出来的值为多少呢,是不是等于-1呢。下面的图来证明
为什么num的值会变成这样呢。这个是可以计算出来的,并不是一个没有意义的数。
因为short只有16位,当我们将一个int 的值交给一个short的指针来操作时会发生截断,只能操作后面的16位此时我们的*Num的值0xFFFF为-1
加上100后自然为99.但是原来num的值会发生变化。指针是直接来操作地址的,我们把*pNum的值加上一百之后,里面的值就发生变化。由原来的0xFFFF变成了0x63.所以原来的num就变成了0xFFFF0063.所以它的值为