gpt4 book ai didi

c - unsigned long long int 常量值与乘法值

转载 作者:太空宇宙 更新时间:2023-11-04 01:11:40 25 4
gpt4 key购买 nike

我尝试了下面的方法,似乎“测试”的结果是错误的值。 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

最佳答案

2500 * 2500 * 2500 永远不会提升到 int 之后,因此发生的有符号溢出(顺便说一句,UB)会阻止正确的计算执行。

要允许它,您必须告诉编译器您的文字属于特定类型。有两种方法可以做到这一点:

  1. 通过转换——转换文字通常在编译时处理,没有运行时开销:

    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)),则强制转换为时已晚,无法保留数据。

  2. 通过后缀:

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

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

关于c - unsigned long long int 常量值与乘法值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com