关于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
總結
以上是生活随笔為你收集整理的关于longlong与位运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最优化学习笔记(四)——最速下降法
- 下一篇: 互联网晚报 | 2月21日 星期一 |