Aioverst 2020-01-16 18:45 采纳率: 100%
浏览 594
已采纳

C语言int p=10; printf ("%d",1.2*p)输出值为什么为0? 令p=2,输出值又为什么等于858993459了?

C语言int p=10; printf ("%d",1.2*p)输出值为什么为0? 令p=2,输出值又为什么等于858993459了? 难道是因为%d的存在所以后面不能有小数参与运算?

  • 写回答

2条回答 默认 最新

  • greatofdream 2020-01-16 22:10
    关注

    这是一个很底层的问题,证明了高级语言的屏蔽底层的重要性和c语言对内存的灵活操纵,让人摸不到头脑。

    • 首先指出类型转换是要求尽可能不损失精度(原则问题),因此1.2认为double,那么和10相乘,10会类型转换为double,结果为double类型12.0
    • 其次12.0的内存存储,按照标准,应该写为0x40 28 00 00 00 00 00 00,四个字节。为何是这样,自己去翻一本计算机语言教材或者百度看看怎么存浮点数吧
    • 当然目前内存内对数字存储使用小端法;大端法很少见,一般会在网络传输中使用,所以内存存储就变成这样00 00 00 00 00 00 28 40,从左至右内存地址增大。
    printf("%d",)
    

    很可惜打印的是int,32位正好取了前面的4个字节00 00 00 00

    不过要是p=2那么最后结果2.4,你找了一个很难分解的小数,我就直接抄内存里的结果了,懒得笔算,存储为0x33 33 33 33 33 33 03 40,拿出前4个字节,33 33 33 33对应结果为858993459.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题