关于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值