CS50信用卡问题:长整型除以100返回大负数的原因排查
CS50信用卡问题中的整数溢出异常
我在解决CS50的信用卡校验问题时遇到了异常:将长整型数值4003600000000014除以100时,得到了错误的大负数**-1685133312**。
以下是完整代码:
#include <stdio.h> #include <stdlib.h> int main(void) { long int number; long int temp; do { number = get_long("Number: "); } while (number < 0); temp = number; int counter = 1; for (int i = 10; i <= number; i = 10) { number /= i; counter += 1; } printf("%i\n", counter); int product = 0; int divisor = 100; int modulo = 0; //printf("%li\n", (temp % 100) / 10); for (int i = 0; i < counter / 2; i++) { modulo = temp / divisor; divisor *= 100; product += (2 * (modulo % 10)); } printf("%i\n", product); }
异常出现在这段循环代码中:
for (int i = 0; i < counter / 2; i++) { modulo = temp / divisor; divisor *= 100; product += (2 * (modulo % 10)); }
问题原因
modulo被声明为int类型,而temp是long int类型。当执行temp / divisor时,结果的数值远超过了32位int的最大取值(2147483647),触发整数溢出。溢出后超出范围的数值会被截断,最终表现为负数。
解决方法
将modulo的类型从int改为long int,确保变量能容纳除法运算后的大数值,避免溢出:
long int modulo = 0;
内容的提问来源于stack exchange,提问作者GohanHango
相关产品推荐
相关产品推荐

