关于longlong与位运算

数据规模:

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

猜你喜欢

转载自blog.csdn.net/yu121380/article/details/81041476