我尝试了下面的方法,看起来'test‘的结果是错误的。2500*2500*2500 == 15625000000,为什么下面的操作会导致不同的结果?
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);结果:
*************** test = -1554869184, 18446744072154682432
*************** test2 = 15625000000, 15625000000发布于 2012-07-02 13:32:53
2500 * 2500 * 2500永远不会升级到超过int,因此发生的签名溢出(顺便说一句,是UB)会阻止执行正确的计算。
要允许这样做,您必须告诉编译器您的文字是特定类型的。有两种方法可以完成此操作:
将-casting转换为文字的
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.
unsigned long long int test = 2500ULL * 2500ULL * 2500ULL;
这在运行时与转换文字一样有效,但取决于使用情况,可能更容易阅读,也可能更难阅读。后缀必须直接应用于文字(它不能应用于操作的结果,因此(2500 * 2500 * 2500)ULL是非法的。)
发布于 2012-07-02 13:32:11
2500*2500*2500不是一个无符号长整型,因为你正在将它复制到一个无符号长整型。乘法是用int完成的,所以乘法的结果是一个int。等到升级到unsigned long long的时候,已经太晚了。使用2500ULL。
https://stackoverflow.com/questions/11288170
复制相似问题