wxzhuhua 发表于 2021-6-7 14:27

一道让人崩溃的题目

#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)等于多少?

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
没有溢出,就是运行的结果让人崩溃

啥结果?

wxzhuhua 发表于 2021-6-7 15:22

LcwSwust 发表于 2021-6-7 15:07
啥结果?

https://www.ideone.com/hVaYNv

ayb_ice 发表于 2021-6-7 15:43

强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24;

wxzhuhua 发表于 2021-6-7 16:37

ayb_ice 发表于 2021-6-7 15:43
强制转换下就可以了
这有什么崩溃的,基础问题而已
x = in*3300LL*47*100*24;

为啥需要转化?

ayb_ice 发表于 2021-6-7 16:53

wxzhuhua 发表于 2021-6-7 16:37
为啥需要转化?

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

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,毕竟它可以先算一下结果再决定是否需要优化。

LcwSwust 发表于 2021-6-7 17:02

本帖最后由 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打印出来看看两种方式是否有区别。

ayb_ice 发表于 2021-6-7 17:11

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

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

wxzhuhua 发表于 2021-6-7 17:12

LcwSwust 发表于 2021-6-7 17:02
还是没看懂哪有崩溃
x = in*......
改为


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

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

athlon64fx 发表于 2021-6-7 17:54

崩溃说明你的基础有问题。
假设int为32位, 最大值是 7fffffff,而上面那一串乘法是 8xxxxxxx,已经溢出了变成了负数,一个负数赋值给 unsigned long long 以后会补1,结果变成一个非常巨大的正数。最后打印出来的应该是一个巨大的数。

crazyren 发表于 2021-6-7 17:58

输入改为longlong
unsigned long long cal(long long in)

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范围,这该如何解释?

zwsam 发表于 2022-9-3 21:29

zwsam 发表于 2022-9-3 22:45

ihafd 发表于 2022-9-5 11:04

正解
页: [1]
查看完整版本: 一道让人崩溃的题目