一道让人崩溃的题目
#include <stdio.h>unsigned long long cal(unsigned short in)
{
unsigned long long x;
x = in*3300*47*100*24;
x /= 4096*867*15;
return x;
}
int main(void) {
// your code goes here
printf( "cal(6) = %llu", cal(6));
return 0;
}
请问:cal(6)等于多少?
运行一下不就知道了,何必崩溃。in*那里估计就溢出了
LcwSwust 发表于 2021-6-7 14:35
运行一下不就知道了,何必崩溃。in*那里估计就溢出了
没有溢出,就是运行的结果让人崩溃 wxzhuhua 发表于 2021-6-7 14:39
没有溢出,就是运行的结果让人崩溃
啥结果? LcwSwust 发表于 2021-6-7 15:07
啥结果?
https://www.ideone.com/hVaYNv 强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24; ayb_ice 发表于 2021-6-7 15:43
强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24;
为啥需要转化? wxzhuhua 发表于 2021-6-7 16:37
为啥需要转化?
不转换默认就是int型,很容易溢出 本帖最后由 wxzhuhua 于 2021-6-7 17:01 编辑
ayb_ice 发表于 2021-6-7 16:53
不转换默认就是int型,很容易溢出
多谢!
好像是不加LL编译器就强行把long long给优化成int了
不过似乎也可以认为这是一个bug,毕竟它可以先算一下结果再决定是否需要优化。 本帖最后由 LcwSwust 于 2021-6-7 17:03 编辑
wxzhuhua 发表于 2021-6-7 15:22
https://www.ideone.com/hVaYNv
还是没看懂哪有崩溃
x = in*......
改为
x = (unsigned long long)in*......
再试。
把这一步的x打印出来看看两种方式是否有区别。
wxzhuhua 发表于 2021-6-7 16:59
多谢!
好像是不加LL编译器就强行把long long给优化成int了
不过似乎也可以认为这是一个bug,毕竟它可以先 ...
不加的话,中间的结果都是int,最后强制转换成LL再赋值给X,而不是你认为的那样
LcwSwust 发表于 2021-6-7 17:02
还是没看懂哪有崩溃
x = in*......
改为
强制转化也可以的,不过敲太多字有点麻烦...
不是程序崩溃,是俺得不到想要的结果而崩溃了,哈哈。 崩溃说明你的基础有问题。
假设int为32位, 最大值是 7fffffff,而上面那一串乘法是 8xxxxxxx,已经溢出了变成了负数,一个负数赋值给 unsigned long long 以后会补1,结果变成一个非常巨大的正数。最后打印出来的应该是一个巨大的数。
输入改为longlong
unsigned long long cal(long long in) 本帖最后由 wxzhuhua 于 2021-6-8 13:26 编辑
ayb_ice 发表于 2021-6-7 17:11
不加的话,中间的结果都是int,最后强制转换成LL再赋值给X,而不是你认为的那样
...
但cal(6)并未溢出unsigned int范围,这该如何解释? 正解
页:
[1]