鱼C论坛

 找回密码
 立即注册
查看: 2531|回复: 8

[已解决]求助!!

[复制链接]
发表于 2022-12-7 17:07:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int main()
{
        int  n = 100;
        int m = n * 1.1;
        int l  = 100 * 1.1;
        printf("num1 = %d\n", n * 1.1);
        printf("num2 = %d\n", m);
        printf("num3 = %d\n",100 * 1.1);
        printf("num4 = %d\n", l);
        return 0;
}
为什么运行出来结果是:num1 = 1 , num2 = 110, num3 = 1, num4 = 110
最佳答案
2022-12-7 17:50:14
本帖最后由 jackz007 于 2022-12-7 17:53 编辑

      100 * 1.1 是一个浮点数,应该使用 "%f" 来进行显示,当然,如果不想改 "%d" 的话,也可以前置 (int) 进行强制转换。
#include <stdio.h>

int main(void)
{
        int  n = 100                            ;
        int m = n * 1.1                         ;
        int l  = 100 * 1.1                      ;
        printf("num1 = %d\n", (int) (n * 1.1))  ;
        printf("num2 = %d\n", m)                ;
        printf("num3 = %d\n",(int) (100 * 1.1)) ;
        printf("num4 = %d\n", l)                ;
        return 0                                ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-7 17:39:45 | 显示全部楼层
不管怎样,我先提个建议
1、发代码请点击<>设置代码格式
2、如果是新人,跟你说下别人回答你的问题后请点击右下角设置最佳答案
3、人家上辈子欠你啊?请不要在标题加感叹号!!!
4、在标题上可以简洁、清楚地写出遇到的问题,你这叫三无标题
感谢你对论坛的支持!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-7 17:50:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-12-7 17:53 编辑

      100 * 1.1 是一个浮点数,应该使用 "%f" 来进行显示,当然,如果不想改 "%d" 的话,也可以前置 (int) 进行强制转换。
#include <stdio.h>

int main(void)
{
        int  n = 100                            ;
        int m = n * 1.1                         ;
        int l  = 100 * 1.1                      ;
        printf("num1 = %d\n", (int) (n * 1.1))  ;
        printf("num2 = %d\n", m)                ;
        printf("num3 = %d\n",(int) (100 * 1.1)) ;
        printf("num4 = %d\n", l)                ;
        return 0                                ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-7 21:08:29 | 显示全部楼层
本帖最后由 xiaotubie 于 2022-12-7 21:24 编辑

因为不管是n*1.1  还是   100*1.1   结果都是一个double类型的浮点数,占用8个字节,在计算机中采用的是符号+指数+尾数 的二进制存储方式。
在内存中按照从低到高的地址存的是:   01 00 00 00 00 80 5b 40 。 而%d取4字节整型输出,所以拿到前面的01 00 00 00 ,最后输出了1

而int  m=n*1.1 , m是一个4字节整型的110 ,内存中存储的是6E 00 00 00,   %d刚好全部拿出,输出了110

我们再来个实验 %d 改成  %lld  我们让它输出8个字节的长整型,最后就把整个 01 00 00 00 00 80 5b 40 拿出来,当做整型来就算,当然你要返过来计算,因为是按小端存储的 ,结果很大很大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-7 21:20:53 | 显示全部楼层
[上传图片失败]
100*1.1对应的十六进制为:01 00 00 00  00 80 5b 40[反汇编窗口,double类型]
当你printf的时候会把这个值复制到栈中,
但是int的大小是4字节,该函数会识别前4字节01 00 00 00 ,所以输出的值是1
[在x86环境下测试]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-12-9 15:56:31 | 显示全部楼层
高山 发表于 2022-12-7 17:39
不管怎样,我先提个建议
1、发代码请点击设置代码格式
2、如果是新人,跟你说下别人回答你的问题后请点击 ...

谢谢建议
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-9 16:14:04 | 显示全部楼层
xiaotubie 发表于 2022-12-7 21:08
因为不管是n*1.1  还是   100*1.1   结果都是一个double类型的浮点数,占用8个字节,在计算机中采用的是符号 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-9 16:14:39 | 显示全部楼层
Hello110 发表于 2022-12-7 21:20
[上传图片失败]
100*1.1对应的十六进制为:01 00 00 00  00 80 5b 40[反汇编窗口,double类型]
当你printf ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-9 17:28:19 | 显示全部楼层

没事,以后继续加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 20:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表