关于longlong与位运算
數(shù)據(jù)規(guī)模:
int: -(2^31-1) ~ +(2^31-1)
long long:-(2^63-1) ~ +(2^63-1)
?
由于默認(rèn)的數(shù)字都是int型,所以在做乘法運(yùn)算時(shí)會(huì)很容易想到int的溢出問(wèn)題,如
printf("%d\n", 100000 * 100000);輸出結(jié)果:1410065408
即使意識(shí)到了超int范圍,用lld打印,但因?yàn)橐呀?jīng)發(fā)生溢出,被截?cái)?#xff0c;所以結(jié)果不會(huì)變
printf("%lld\n", 100000 *100000); 輸出結(jié)果:1410065408
必須要進(jìn)行強(qiáng)制轉(zhuǎn)換
printf("%lld\n", (longlong)100000 * 100000);輸出結(jié)果:100000000000
?
乘法接觸比較多而且數(shù)字比較大,還是很容易意識(shí)到溢出的問(wèn)題,然而,此溢出問(wèn)題同樣存在于位運(yùn)算當(dāng)中,而且由于位運(yùn)算的數(shù)字都比較小,常常被遺忘了溢出……雖然能知道數(shù)據(jù)類型的范圍,卻會(huì)忘記了強(qiáng)制轉(zhuǎn)化導(dǎo)致溢出………………如:
long long a = 1<<31;
printf("%lld\n", a);
輸出結(jié)果:-2147483648
雖然知道1<<31超了int范圍,所以定義為longlong,然而這樣定義一個(gè)longlong類型卻發(fā)生了錯(cuò)誤,原因就在于溢出1的默認(rèn)類型為int,在運(yùn)算<<時(shí),由于超過(guò)了int類型,被截?cái)嗔?#xff0c;然后才因?yàn)橘x值給a被轉(zhuǎn)換為了longlong型,但實(shí)際上仍發(fā)生了溢出,造成了錯(cuò)誤
long long b = (long long)1<<31;
printf("%lld\n", b);
輸出結(jié)果:2147483648
總結(jié)
以上是生活随笔為你收集整理的关于longlong与位运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最优化学习笔记(四)——最速下降法
- 下一篇: 互联网晚报 | 2月21日 星期一 |