Rumah >pembangunan bahagian belakang >C++ >Mengapa limpahan integer menghasilkan tingkah laku yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?

Mengapa limpahan integer menghasilkan tingkah laku yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?

Susan Sarandon
Susan Sarandonasal
2024-11-17 08:15:03939semak imbas

Why does integer overflow result in different behavior for signed and unsigned integers?

Memahami Limpahan Integer Ditandatangani/Tidak Ditandatangani

Dalam proses pembelajaran tentang limpahan integer dalam C , soalan berikut timbul:

Mengapa saya memperoleh hasil ini dengan limpahan integer yang ditandatangani/tidak ditandatangani?"

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;
}

Output:

0
2147483647
-2147483648

0
4294967295
0

Penjelasan:

Memahami limpahan integer dalam C memerlukan pemahaman tentang jenis integer bertanda dan tidak bertanda.

  • Timpa Integer yang Ditandatangani:

Limpahan integer yang ditandatangani dianggap tingkah laku tidak ditentukan, bermakna pengkompil tidak perlu menentukan gelagat yang tepat apabila integer yang ditandatangani melimpah. Dalam amalan, kebanyakan pelaksanaan menyimpan integer yang ditandatangani menggunakan perwakilan pelengkap 2 Ini bermakna apabila integer yang ditandatangani melimpah, nilainya "bergulung" kepada julat negatif Dalam contoh, menambah 1 kepada integer positif maksimum (2147483647) menggunakan tandatangan. integer menghasilkan -2147483648, integer negatif minimum.

  • Limpahan Integer Tidak Ditandatangani:

Sebaliknya, limpahan integer tidak ditandatangani ialah baik -defined, dengan nilai dibalut kepada sifar apabila ia melebihi nilai maksimum. Dalam contoh, menambah 1 pada integer tidak bertanda maksimum (4294967295) menghasilkan 0. Ini kerana integer tidak bertanda tidak mempunyai konsep nilai negatif.

Atas ialah kandungan terperinci Mengapa limpahan integer menghasilkan tingkah laku yang berbeza untuk integer yang ditandatangani dan tidak ditandatangani?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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