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

Susan Sarandon
Lepaskan: 2024-11-17 08:15:03
asal
875 orang telah melayarinya

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

Output:

0
2147483647
-2147483648

0
4294967295
0
Salin selepas log masuk

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!

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