数据类型之坑

我们有如下程序。

#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 = &num;
    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.所以它的值为这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值