Rumah >pembangunan bahagian belakang >C++ >Apakah Perwakilan Perangkap dalam C dan Bagaimanakah Ia Berbeza dalam C?

Apakah Perwakilan Perangkap dalam C dan Bagaimanakah Ia Berbeza dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 04:28:32854semak imbas

What are Trap Representations in C and How Do They Differ in C  ?

Perwakilan Perangkap dalam C

Pengenalan

Dalam C, perwakilan perangkap merujuk kepada corak bit yang sesuai dengan peruntukan memori jenis data tetapi mencetuskan tingkah laku yang tidak ditentukan apabila ditafsirkan sebagai nilai itu taip.

Contoh

Salah satu contoh lazim bagi perwakilan perangkap ialah NaN isyarat (Bukan Nombor) dalam jenis titik terapung. Piawaian C99 secara eksplisit mentakrifkan gelagat isyarat NaN sebagai tidak ditentukan, walaupun gelagatnya dinyatakan dengan baik dalam piawaian lain.

Kesesuaian kepada C

Perwakilan perangkap juga boleh digunakan untuk C . Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa C memperkenalkan mekanisme keselamatan jenis tambahan yang mungkin menghalang beberapa operasi yang akan mengakibatkan kelakuan tidak ditentukan dalam C.

Perwakilan Penunjuk dan Terapung

Dalam coretan kod yang disediakan:

float f = 3.5;
int *pi = (int*)&f;

Dengan mengandaikan sizeof(int) == sizeof(float), f dan *pi tidak mempunyai perwakilan binari yang sama. Penukaran daripada apungan kepada int menggunakan hantaran penunjuk menghasilkan gelagat yang tidak ditentukan disebabkan oleh peraturan alias penunjuk. Untuk mengekstrak perwakilan integer apungan dengan betul, pendekatan berikut harus digunakan:

int extract_int(float f)
{
    union { int i; float f; } u;
    u.f = f;
    return u.i;
}

Walaupun kod ini mempunyai gelagat yang tidak ditentukan dalam C99, ia masih menghasilkan nilai integer yang sah yang bukan perwakilan perangkap.

Atas ialah kandungan terperinci Apakah Perwakilan Perangkap dalam C dan Bagaimanakah Ia Berbeza dalam C?. 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