Chinaunix

标题: 整数乘法问题,求助!! [打印本页]

作者: thelordsaves    时间: 2013-01-11 16:52
标题: 整数乘法问题,求助!!
写了如下一个测试程序:
  1. #include <stdio.h>

  2. #define num1 (10000000*1000000)

  3. int main()
  4. {
  5.     printf("%d\r\n", num1);
  6.     return 0;
  7. }
复制代码
输出结果是1316134912

显然是溢出了,整数乘法在这种超大的情况下溢出处理是怎么样的?为什么最终结果是1316134912,

谁能给出计算机的计算过程。
作者: pmerofc    时间: 2013-01-11 16:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: thelordsaves    时间: 2013-01-11 17:05
愿闻其祥回复 2# pmerofc


   
作者: hellioncu    时间: 2013-01-11 17:07
针对你这个情况
10000000000000 = 0x9184E72A000
截断后0x4E72A000=1316134912
作者: thelordsaves    时间: 2013-01-11 17:10
我去,现在才发现是因为自己少写了一个零,懂了,多谢!回复 4# hellioncu


   
作者: pmerofc    时间: 2013-01-11 17:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: thelordsaves    时间: 2013-01-11 17:19
本帖最后由 thelordsaves 于 2013-01-11 17:23 编辑

按照标准应该是这样。看样子之所以能得出结果是gcc的具体实现了。回复 6# pmerofc


   
作者: pmerofc    时间: 2013-01-11 18:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: love_wisdom    时间: 2013-01-11 19:01
UB是啥?  
作者: pmerofc    时间: 2013-01-11 19:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: love_wisdom    时间: 2013-01-11 19:17
谢谢!   
作者: kzl0629    时间: 2013-01-11 20:58
#define num ((long long)100000000 * (long long)100000000) //这个是亿比千万要大~~~

printf("%lld\n",num);

首先得达到目的,再说别的,扯那些没用的干啥~~

作者: goldenfort    时间: 2013-01-12 13:33
回复 1# thelordsaves


    这种应该有大数计算库, 网上应该有的。

    如果直接用C语言  本身  计算, 64 bit的计算机, 最大只能表示 64bit的 int数,

   一定会受到限制的。

    用大数计算库, 把大数用软件的数据结构来表示,想计算多大,就多大
作者: thelordsaves    时间: 2013-01-12 14:53
好的,多谢!回复 13# goldenfort


   
作者: starwing83    时间: 2013-01-12 15:24
可以加ULL后缀。

输出请用%lld
作者: pmerofc    时间: 2013-01-12 15:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: starwing83    时间: 2013-01-12 16:01
大数运算库,如果要速度并且专业计算,推荐GMP(GNU的少数还值得称道的作品),如果要适应性广但对速度没啥要求,可以M-APM,如果想找个代码简单点儿的学习或者研究,可以看看libtommath,风格还不错。

反正都比自己写好多了……不过如果你只是想要64bit计算的话,用32bit算也挺快的吧……

a*b
= (a1*2^16+a2)*(b1*2^16+b2)
= a1*b1*2^32 + a1*b2*2^16 + a2*b1*2^16 + a2*b2

所以通过这个式子直接算lo和hi也挺方便的吧……

作者: thelordsaves    时间: 2013-01-12 16:14
牛人正解,你总是能更进一步,哈哈回复 16# pmerofc


   
作者: thelordsaves    时间: 2013-01-12 16:16
非常全,真是太感谢了!回复 17# starwing83


   
作者: 方兆国    时间: 2013-01-12 17:20
hellioncu 发表于 2013-01-11 17:07
针对你这个情况
10000000000000 = 0x9184E72A000
截断后0x4E72A000=1316134912


10000000000000除以16得除多久啊……您真有耐心
作者: hellioncu    时间: 2013-01-12 21:17
方兆国 发表于 2013-01-12 17:20
10000000000000除以16得除多久啊……您真有耐心


Windows自带的计算器一下子就能转换好
作者: 方兆国    时间: 2013-01-12 21:20
回复 21# hellioncu


    这个……刚刚发现,谢谢你
作者: 方兆国    时间: 2013-01-12 21:21
回复 21# hellioncu


    我刚开始手工算了一会儿,就不想算了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2