| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 790 人关注过本帖
标题:请大家看看这个为什么会溢出
只看楼主 加入收藏
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
结帖率:100%
收藏
已结贴  问题点数:4 回复次数:15 
请大家看看这个为什么会溢出
long long是64位的,sizeof也这么显示,但是定义一个sum,sum=100000*100000,输出却溢出;即使改成无符号类型还是溢出。改成循环,100000连乘5次10却不会,为什么?
搜索更多相关主题的帖子: long 
2012-01-15 12:02
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
有 long long sum; 这么定义的吗?我的编译器不支持哦。

梅尚程荀
马谭杨奚







                                                       
2012-01-15 12:27
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
有啊……VC不支持,请改为__int64

酱油实习生
2012-01-15 13:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
改了,也试了好些,都溢出。是不是32位机不兼容?

梅尚程荀
马谭杨奚







                                                       
2012-01-15 13:33
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
不会吧?要老命了这……但是我用循环乘的方法可以

酱油实习生
2012-01-15 13:50
chanbo
Rank: 2
来 自:陕西咸阳
等 级:论坛游民
帖 子:38
专家分:74
注 册:2011-11-26
收藏
得分:0 
这个问题好高级……
2012-01-15 14:26
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
提示: 该帖被管理员或版主屏蔽
2012-01-15 14:37
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:1 
程序代码:
#include <stdio.h>

int main(int argc, char *argv[])
{
    __int64 sum = (__int64)((__int64)100000*(__int64)100000);
    printf("%I64d\n", sum);
    return 0;
}

技术问题,请不要以短消息方式提问
2012-01-15 14:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
回复 楼主 墨清扬
=號賦值之前,是把右邊運算的結果暫存在某個中間變量上的,那個變量的數據類型,由參與運算的數據類型決定,100000*100000,兩個都是int型,那麼編譯器分配的暫存變量也同樣是int型,是不足以容納結果的,因此若寫(long long)(100000*100000),在強制轉換之前,就已經溢出。要避免溢出,應該在運算之前就提升數據類型,寫(long long)100000*100000,事先把第一個100000提升到long long,那麼編譯器就知道把結果暫存變量設定為long long型,同時自動把後面的100000也提升為long long,再進行運算,因此,不用顯式提升後面的100000也可以了,當然,寫上也沒問題。

[ 本帖最后由 TonyDeng 于 2012-1-15 16:22 编辑 ]

授人以渔,不授人以鱼。
2012-01-15 16:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:1 
基础知识掌握的不扎实。

32位编译器默认的常整数是32位整型。

强制类型转换是个方法,但还可以简单地通过添加类型后缀“LL”告诉编译器你的数字是64位整型的。

sum = 100000LL * 100000;

重剑无锋,大巧不工
2012-01-15 18:20
快速回复:请大家看看这个为什么会溢出
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012465 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved