打印
[C语言]

一道让人崩溃的题目

[复制链接]
2693|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wxzhuhua|  楼主 | 2021-6-7 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
LcwSwust| | 2021-6-7 14:35 | 只看该作者
运行一下不就知道了,何必崩溃。in*那里估计就溢出了

使用特权

评论回复
板凳
wxzhuhua|  楼主 | 2021-6-7 14:39 | 只看该作者
LcwSwust 发表于 2021-6-7 14:35
运行一下不就知道了,何必崩溃。in*那里估计就溢出了

没有溢出,就是运行的结果让人崩溃

使用特权

评论回复
地板
LcwSwust| | 2021-6-7 15:07 | 只看该作者
wxzhuhua 发表于 2021-6-7 14:39
没有溢出,就是运行的结果让人崩溃

啥结果?

使用特权

评论回复
5
wxzhuhua|  楼主 | 2021-6-7 15:22 | 只看该作者

https://www.ideone.com/hVaYNv

使用特权

评论回复
6
ayb_ice| | 2021-6-7 15:43 | 只看该作者
强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24;

使用特权

评论回复
7
wxzhuhua|  楼主 | 2021-6-7 16:37 | 只看该作者
ayb_ice 发表于 2021-6-7 15:43
强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24;

为啥需要转化?

使用特权

评论回复
8
ayb_ice| | 2021-6-7 16:53 | 只看该作者
wxzhuhua 发表于 2021-6-7 16:37
为啥需要转化?

不转换默认就是int型,很容易溢出

使用特权

评论回复
9
wxzhuhua|  楼主 | 2021-6-7 16:59 | 只看该作者
本帖最后由 wxzhuhua 于 2021-6-7 17:01 编辑
ayb_ice 发表于 2021-6-7 16:53
不转换默认就是int型,很容易溢出

多谢!
好像是不加LL编译器就强行把long long给优化成int了
不过似乎也可以认为这是一个bug,毕竟它可以先算一下结果再决定是否需要优化。

使用特权

评论回复
10
LcwSwust| | 2021-6-7 17:02 | 只看该作者
本帖最后由 LcwSwust 于 2021-6-7 17:03 编辑

还是没看懂哪有崩溃
x = in*......
改为
x = (unsigned long long)in*......
再试。
把这一步的x打印出来看看两种方式是否有区别。

使用特权

评论回复
11
ayb_ice| | 2021-6-7 17:11 | 只看该作者
wxzhuhua 发表于 2021-6-7 16:59
多谢!
好像是不加LL编译器就强行把long long给优化成int了
不过似乎也可以认为这是一个bug,毕竟它可以先 ...

不加的话,中间的结果都是int,最后强制转换成LL再赋值给X,而不是你认为的那样

使用特权

评论回复
12
wxzhuhua|  楼主 | 2021-6-7 17:12 | 只看该作者
LcwSwust 发表于 2021-6-7 17:02
还是没看懂哪有崩溃
x = in*......
改为

强制转化也可以的,不过敲太多字有点麻烦...

不是程序崩溃,是俺得不到想要的结果而崩溃了,哈哈。

使用特权

评论回复
评论
zlf1208 2021-6-7 20:51 回复TA
我写程序的习惯是不怕麻烦,C语言太灵活,提供了很多偷懒的方法,但是基础不扎实,那些方法都是坑,还是老老实实写程序吧,写不会错的程序,偷懒不是好习惯,你偷懒省下的时间,要用多少查错的时间去弥补,心情还很郁闷,那样偷懒值得吗? 
13
athlon64fx| | 2021-6-7 17:54 | 只看该作者
崩溃说明你的基础有问题。
假设int为32位, 最大值是 7fffffff,而上面那一串乘法是 8xxxxxxx,已经溢出了变成了负数,一个负数赋值给 unsigned long long 以后会补1,结果变成一个非常巨大的正数。最后打印出来的应该是一个巨大的数。

使用特权

评论回复
14
crazyren| | 2021-6-7 17:58 | 只看该作者
输入改为longlong
unsigned long long cal(long long in)

使用特权

评论回复
15
wxzhuhua|  楼主 | 2021-6-8 13:25 | 只看该作者
本帖最后由 wxzhuhua 于 2021-6-8 13:26 编辑
ayb_ice 发表于 2021-6-7 17:11
不加的话,中间的结果都是int,最后强制转换成LL再赋值给X,而不是你认为的那样
...

但cal(6)并未溢出unsigned int范围,这该如何解释?

使用特权

评论回复
16
zwsam| | 2022-9-3 21:29 | 只看该作者

使用特权

评论回复
17
zwsam| | 2022-9-3 22:45 | 只看该作者

使用特权

评论回复
18
ihafd| | 2022-9-5 11:04 | 只看该作者
正解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝