Rumah >pembangunan bahagian belakang >C++ >Apakah Perwakilan Perangkap dalam C, dan Bagaimana Kita Boleh Mengakses Perwakilan Integer Terapung dengan Selamat?
Menyelidiki Perwakilan Perangkap dalam C: Memahami Tingkah Laku Tidak Ditakrifkan
Dalam pengaturcaraan C, "perwakilan perangkap" merujuk kepada corak sedikit yang jatuh dalam ruang memori yang diduduki oleh jenis data tertentu tetapi mencetuskan tingkah laku yang tidak ditentukan jika digunakan sebagai nilai jenis itu. Walaupun tidak ditakrifkan secara eksplisit dalam C89, istilah ini diperkenalkan dalam C99 dan berfungsi sebagai penangkapan untuk corak bit sedemikian.
Kewujudan perwakilan perangkap tidak dijamin untuk semua jenis data. Malah, piawaian secara eksplisit menyatakan bahawa aksara yang tidak ditandatangani adalah satu-satunya jenis yang dijamin tidak mempunyai perwakilan perangkap. Walau bagaimanapun, ia menyediakan dua contoh hipotetikal perwakilan perangkap, yang sebahagian besarnya tidak relevan dalam amalan pengkomputeran moden. Terutamanya, contoh perwakilan perangkap yang lebih praktikal ialah NaN isyarat (Bukan-Nombor) dalam jenis titik terapung.
Mengenai coretan kod anda, dengan pembolehubah apungan ditukar kepada penuding int:
float f=3.5; int *pi = (int*)&f;
Dengan mengandaikan sizeof(int) dan sizeof(float) adalah sama, adalah penting untuk ambil perhatian bahawa kod ini mempunyai gelagat yang tidak ditentukan kerana peraturan aliasing penunjuk. Ia tidak berkaitan dengan perwakilan perangkap.
Untuk mengekstrak perwakilan integer bagi nilai apungan dengan betul, anda boleh menggunakan kod berikut:
int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
Kod ini menggunakan kesatuan untuk mentafsir nilai apungan sebagai integer, yang memberikan gelagat yang tidak ditentukan dalam C99. Walaupun nilai integer tepat yang dikembalikan tidak ditakrifkan, ia menjamin integer yang sah, mengelakkan perwakilan perangkap.
Atas ialah kandungan terperinci Apakah Perwakilan Perangkap dalam C, dan Bagaimana Kita Boleh Mengakses Perwakilan Integer Terapung dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!