数据规模:
int: -(2^31-1) ~ +(2^31-1)
long long:-(2^63-1) ~ +(2^63-1)
由于默认的数字都是int型,所以在做乘法运算时会很容易想到int的溢出问题,如
printf("%d\n", 100000 * 100000);输出结果:1410065408
即使意识到了超int范围,用lld打印,但因为已经发生溢出,被截断,所以结果不会变
printf("%lld\n", 100000 *100000); 输出结果:1410065408
必须要进行强制转换
printf("%lld\n", (longlong)100000 * 100000);输出结果:100000000000
乘法接触比较多而且数字比较大,还是很容易意识到溢出的问题,然而,此溢出问题同样存在于位运算当中,而且由于位运算的数字都比较小,常常被遗忘了溢出……虽然能知道数据类型的范围,却会忘记了强制转化导致溢出………………如:
long long a = 1<<31;
printf("%lld\n", a);
输出结果:-2147483648
虽然知道1<<31超了int范围,所以定义为longlong,然而这样定义一个longlong类型却发生了错误,原因就在于溢出1的默认类型为int,在运算<<时,由于超过了int类型,被截断了,然后才因为赋值给a被转换为了longlong型,但实际上仍发生了溢出,造成了错误
long long b = (long long)1<<31;
printf("%lld\n", b);
输出结果:2147483648