为什么这两段代码结果不一样?

redred82 2010-04-09 07:26:35
int main() {
float a = 36893488147419103231;
printf("%f", a);
return 0;
}
结果为18446744073709552000.000000
int main() {
float a = 36893488147419103231.;
printf("%f", a);
return 0;
}
结果为36893488147419103000.000000

其中原理一直搞不明白,还请指点!
...全文
219 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sad_beyond 2010-04-09
  • 打赏
  • 举报
回复
这与类型转换有关,如double型的数据转化为float型时,只截取前7位有效数字,而后面的就不可靠了!
redred82 2010-04-09
  • 打赏
  • 举报
回复
结贴散分,感谢
keiy
柯本 2010-04-09
  • 打赏
  • 举报
回复
这个与编译器有关,具体只能看编译器的文档了
一般情况下,常量都会以它的最大支持扩展,另外还要看你定义的变量
如果你写
long long b=36893488147419103231;
它就会转成有符号的了
redred82 2010-04-09
  • 打赏
  • 举报
回复
明白了,那编译器依据什么来确定常量使用的存储位数呢?
是不是32位不够就自动变成64位ULL,那64位有符号的LL的正数,怎么表示?
还有怎么给法??
柯本 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 redred82 的回复:]
看了keiy兄的解释我也晕了!!

那么float a = 36893488147419103231;
该常量为64位的有符号long long? 应该是溢出了吧?不然也表示不出2的65次方减1这样的数啦。
[/Quote]
是溢出,36893488147419103231溢出后 unsigned long long 就是18446744073709551615
redred82 2010-04-09
  • 打赏
  • 举报
回复
看了keiy兄的解释我也晕了!!

那么float a = 36893488147419103231;
该常量为64位的有符号long long? 应该是溢出了吧?不然也表示不出2的65次方减1这样的数啦。
柯本 2010-04-09
  • 打赏
  • 举报
回复
补充一下
unsigned long long的范围为0 to 18,446,744,073,709,551,615
而非
0 to 36893488147419103231
柯本 2010-04-09
  • 打赏
  • 举报
回复
gcc支持64位常量.且把它当成为无符号的

36893488147419103231为64位的-1,无符号的话就是18446744073709551615
转为浮点后就为18446744073709552000.000000了
看一下:
int main() {
float a = 36893488147419103231;
long long b=36893488147419103231;
unsigned long long d=b;
printf("%f %lld %llu\n", a,b,d);
return 0;
}
lizhuo_0218 2010-04-09
  • 打赏
  • 举报
回复
好晕啊
redred82 2010-04-09
  • 打赏
  • 举报
回复
使用gcc,第二段代码很好理解,第一段搞不清楚,如果是int来存储36893488147419103231,那远远小于18446744073709552000,而且36893488147419103231这个数是个临界数,如果是36893488147419103232,那么打印出的结果将变成零。
还有这两个数的特点是36893488147419103231为2的65次方减1.
而结果18446744073709552000接近2的64次方。
有谁已解释其中机关啊,百思不得其解gcc的处理方式!!!!
柯本 2010-04-09
  • 打赏
  • 举报
回复
第1个程序是有问题的,对某些编译器而言36893488147419103231先会当成整型,溢出后的结果赋给a,就像char c=257; c 的结果为1类同.而程序2是将浮点36893488147419103231.0赋给a,是可以的,只是会损失精度
对有些编译器(如vs2008),程序1无法编译,error C2177: 常量太大
fox000002 2010-04-09
  • 打赏
  • 举报
回复
因为 = 前后的类型不一致,存在隐式类型转换

1

int -> float

这里是溢出了吧

2

double -> float
企业智慧中台规划与建设总体方案是一个针对企业数字化转型需求而设计的综合性IT解决方案。该方案旨在构建一个集中、高效和灵活的中台架构,通过整合企业内外部的数据资源、业务流程和应用服务,为企业提供一个统一的数字化运营平台。在当前的商业环境下,企业面临着激烈的市场竞争和不断变化的客户需求。为了应对这些挑战,企业需要快速响应市场变化,提高运营效率,降低成本,并实现持续创新。因此,企业智慧中台的规划和建设成为了关键任务。该方案的核心思想是将企业的业务逻辑、数据管理和技术创新紧密结合起来,形成一个高度集成的智慧中台系统。通过构建标准化的数据模型和接口,实现数据的一致性和可访问性,同时提供丰富的数据分析和挖掘工具,帮助企业发现潜在的商业价值和机会。此外,该方案还注重用户体验和业务敏捷性。通过构建灵活的应用开发框架和API接口,支持快速的业务迭代和定制化需求,满足不同部门和角色的个性化需求。同时,通过智能化的自动化流程和决策支持系统,提高企业的决策效率和准确性。总之,企业智慧中台规划与建设总体方案是一个全面而深入的IT解决方案,旨在帮助企业实现数字化转型,提升竞争力和创新能力。通过构建集中、高效和灵活

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧