Rumah > pembangunan bahagian belakang > C++ > Mengapakah limpahan integer dalam C membawa kepada hasil yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?

Mengapakah limpahan integer dalam C membawa kepada hasil yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?

Patricia Arquette
Lepaskan: 2024-11-12 01:37:03
asal
843 orang telah melayarinya

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

Hasil Tidak Dijangka daripada Limpahan Integer Ditandatangani/Tidak Ditandatangani

Dalam C , limpahan integer boleh membawa kepada hasil yang tidak dijangka bergantung pada tanda jenis data .

Pertimbangkan perkara berikut program:

#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;
}
Salin selepas log masuk

Output program ini mungkin mengejutkan anda:

0
2147483647
-2147483648

0
4294967295
0
Salin selepas log masuk

Penjelasan

Untuk integer yang ditandatangani, tingkah laku limpahan tidak ditentukan. Dalam kebanyakan pelaksanaan, pelengkap 2 digunakan, yang membawa kepada gelagat pembungkusan yang tidak dijangka. Sebagai contoh, dalam atur cara di atas:

  • x dimulakan kepada 0 dan kemudian melimpah ke nilai positif maksimumnya, 2147483647.
  • Apabila 1 ditambahkan pada nilai melimpah ini, ia membalut sekitar nilai negatif minimumnya, -2147483648.

Untuk integer tidak bertanda, limpahan ditakrifkan dengan baik dan melilit modulo 2bit. Dalam erti kata lain, nilai ditetapkan semula kepada 0 apabila melebihi maksimum. Ini menerangkan output untuk y, di mana y dililitkan kepada 0 selepas melimpahi nilai maksimum yang tidak ditandatangani, 4294967295.

Adalah penting untuk ambil perhatian bahawa kelakuan untuk limpahan integer yang ditandatangani tidak dijamin oleh bahasa dan mungkin berbeza-beza bergantung pada pelaksanaan dan seni bina mesin. Oleh itu, biasanya tidak disyorkan untuk bergantung pada tingkah laku sedemikian dalam program anda.

Atas ialah kandungan terperinci Mengapakah limpahan integer dalam C membawa kepada hasil yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan