首頁 > 後端開發 > C++ > 主體

為什麼 C 中的整數溢位會導致有符號和無符號整數的不同結果?

Patricia Arquette
發布: 2024-11-12 01:37:03
原創
737 人瀏覽過

Why does integer overflow in C   lead to different results for signed and unsigned integers?

有符號/無符號整數溢位的意外結果

在 C中,整數溢位可能會導致意外結果,取決於資料類型的符號性.

考慮以下程序:

#include <iostream>

int main()
{
    int x(0);
    std::cout << x << std::endl;

    x = x + 2147483647;
    std::cout << x << std::endl;

    x = x + 1;
    std::cout << x << std::endl;
    std::cout << std::endl;

    unsigned int y(0);
    std::cout << y << std::endl;

    y = y + 4294967295;
    std::cout << y << std::endl;

    y = y + 1;
    std::cout << y << std::endl;
}
登入後複製

這個程式的輸出可能會讓你大吃一驚:

0
2147483647
-2147483648

0
4294967295
0
登入後複製

解釋

對於有符號整數,溢位行為是未定義的。在大多數實作中,使用 2 的補碼,這會導致意外的環繞行為。例如,在上面的程式中:

  • x 初始化為 0,然後溢到其最大正值 2147483647。
  • 當這個溢位值加 1 時,它會換行大約到其最小負值 -2147483648。

對於 無符號整數,溢位是明確定義的並且圍繞著模 2位元 進行環繞。換句話說,當溢出最大值時,該值被重置為0。這解釋了 y 的輸出,其中 y 在溢出最大無符號值 4294967295 後迴繞到 0。

需要注意的是,有符號整數溢位的行為不受語言保證,並且可能會因語言而異實作和機器架構。因此,通常不建議在程序中依賴此類行為。

以上是為什麼 C 中的整數溢位會導致有符號和無符號整數的不同結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板