首頁  >  文章  >  後端開發  >  為什麼在「long long int」賦值中乘以整數文字會導致溢位?

為什麼在「long long int」賦值中乘以整數文字會導致溢位?

DDD
DDD原創
2024-11-08 08:28:01399瀏覽

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Long Long Int 賦值中的溢位:為什麼整數文字相乘失敗

在提供的程式碼片段中,嘗試了三個long long 整數賦值:

long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works

雖然第三個賦值成功,但為什麼第一個賦值儘管使用了 long long int 還是會溢出?

理解整數型別

溢位的原因在於整數型態的本質。預設情況下,整數文字被指派可以表示其值的最小類型,但不小於 int。在給定的情況下,2000 是一個 int,在大多數系統上通常會佔用 32 位元。

乘法規則

算術運算子(例如乘法)通過所涉及的兩種類型中較大的一個,但不小於 int。例如:

  • char * char 將會呼叫operator*(int,int) -> int
  • char * int 將會呼叫運算子*(int,int) -> int
  • long * int 將會呼叫運算子*(long,long) -> long

但是,int * int 仍然呼叫operator*(int,int) -> int.

型別提升與溢位

在溢出賦值中,2000*2000*2000*2000 涉及到4 個int值相乘,得到一個比 int 更大的整數可以持有。儘管最終結果儲存在 long long int 變數中,但乘法是用整數進行的。

解決溢出

為了避免溢出,可以使用以下方法方法:

  • 明確使用2000LL,它表示一個long long int文字。
  • 使用 pow(2000,4) 以 double 形式執行計算,然後將其指派給 long long int 變數。
  • 直接將大整數值,例如 16000000000000 賦給 long long int 變數。

以上是為什麼在「long long int」賦值中乘以整數文字會導致溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn