首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无符号长整型整型常量值与乘法值

无符号长整型整型常量值与乘法值
EN

Stack Overflow用户
提问于 2012-07-02 13:28:16
回答 2查看 583关注 0票数 1

我尝试了下面的方法,看起来'test‘的结果是错误的。2500*2500*2500 == 15625000000,为什么下面的操作会导致不同的结果?

代码语言:javascript
复制
unsigned long long int test = 2500*2500*2500;
fprintf(stderr, "*************** test = %lld, %llu\n", test, test);
unsigned long long int test2 = 15625000000;
fprintf(stderr, "*************** test2 = %lld, %llu\n", test2, test2);

结果:

代码语言:javascript
复制
*************** test = -1554869184, 18446744072154682432
*************** test2 = 15625000000, 15625000000
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-02 13:32:53

2500 * 2500 * 2500永远不会升级到超过int,因此发生的签名溢出(顺便说一句,是UB)会阻止执行正确的计算。

要允许这样做,您必须告诉编译器您的文字是特定类型的。有两种方法可以完成此操作:

将-casting转换为文字的

  1. By通常在编译时处理,没有运行时开销:

unsigned long long int test = (unsigned long long int)2500 * (unsigned long long int)2500 * (unsigned long long int)2500;

请注意,强制转换是单独对被乘数执行的。如果操作的结果是强制转换(例如(unsigned long long int)(2500 * 2500 * 2500)),那么转换就太晚了,无法保留data.

  • By后缀:

unsigned long long int test = 2500ULL * 2500ULL * 2500ULL;

这在运行时与转换文字一样有效,但取决于使用情况,可能更容易阅读,也可能更难阅读。后缀必须直接应用于文字(它不能应用于操作的结果,因此(2500 * 2500 * 2500)ULL是非法的。)

票数 3
EN

Stack Overflow用户

发布于 2012-07-02 13:32:11

2500*2500*2500不是一个无符号长整型,因为你正在将它复制到一个无符号长整型。乘法是用int完成的,所以乘法的结果是一个int。等到升级到unsigned long long的时候,已经太晚了。使用2500ULL

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11288170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档