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
737 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!

sumber:php.cn
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