Ketika pengkodean dalam bahasa tingkat rendah seperti CI menemukan bahwa casting kadang-kadang berarti 'menafsirkan kembali byte ini seolah-olah selalu dari tipe lain ini' dan di waktu lain sebagai 'mengubah nilai ini secara cerdas ke tipe lain ini'.
Apa arti asli dari kata itu dan apakah ada konsistensi kapan harus mengharapkan konversi dan kapan harus mengharapkan penafsiran ulang mentah?
terminology
type-casting
Alexander Torstling
sumber
sumber
cast
dalam arti komputasi lebih mirip dengan casting dalam arti metalurgi, di mana bentuk logam cair direformasi ketika dituangkan ke dalam cetakan: britannica.com/EBchecked/topic/377665/metallurgy/81884/CastingJawaban:
Casting dalam bahasa C itu unik, tidak seperti bahasa lain. Itu juga tidak pernah cerdas.
Casting dalam C mengkonversi nilai dari satu tipe ke tipe lainnya menggunakan aturan yang didefinisikan dengan cermat. Jika Anda benar-benar perlu tahu, baca standarnya. Kalau tidak, poin utamanya adalah:
Beberapa gips diterapkan secara implisit, dan dalam beberapa gips kompiler akan mengeluarkan peringatan. Yang terbaik untuk memperhatikan peringatan!
Definisi kamus untuk pemain paling baik diabaikan, karena tidak membantu. Banyak pemeran yang lebih baik dideskripsikan dengan istilah konversi atau pemaksaan, jadi perlu juga diketahui.
C ++ jauh lebih rumit, tetapi Anda tidak menanyakan itu, bukan?
sumber
T*
kevoid*
belakang selalu didefinisikan dengan baik.Bagian dari kamus Webster ini memberikan definisi yang tepat:
Jadi, sebelum casting, "objek" Anda (bukan secara harfiah objek OOP) dalam bentuk (tipe) tertentu. Ketika Anda melemparkannya kembali, itu adalah "tuangkan beton" di sekitarnya untuk membuatnya menjadi bentuk baru, itulah yang Anda lakukan dengan casting. Anda memiliki angka sebagai bilangan bulat berbentuk segi enam, dan setelah casting, Anda akan mendapatkan string berbentuk persegi panjang.
sumber
Mungkin berguna untuk memisahkan gips C menjadi dua kelompok:
Numeric casts - mengonversi angka antara satu representasi ke yang lain, berusaha mempertahankan nilainya. Misalnya -
(int)3.1
akan3
. Ada aturan pasti yang mendefinisikan apa yang terjadi ketika nilai pastinya tidak dapat disimpan.Cast Pointer - Menyimpan alamat memori, tetapi mengubah cara itu dereferenced. Misalnya, untuk
float x=3.5
,*(int *)&x
akan memberikan1080033280
- bilangan bulat ini diwakili oleh pola bit yang sama yang mewakili float3.5
.sumber
Keep the memory address, but change the way it's dereferenced.
Menereferensi pointer yang dihukum tidak ditentukan. Standar hanya menjamin pengecoran dariA *
keB *
& kembali akan menghasilkan hal yang samaA *
, yang mungkin tidak berlaku untuk dereferensi di tempat pertama - atau bahwa jikaB *
achar *
, dapat digunakan untuk membaca representasi objek dari jenis apa pun. Untuk semua tipe lainnya,B *
pointer dereferencing adalah type-punning, UB, & melanggar alias ketat. Pokoknya, bahkan jika kompilator tidak membuang contoh 2 di atas karena alasan itu, Anda membuat asumsi yang tidak dapat dipercaya tentang pola bitDalam C ++ berbagai jenis gips dapat dibuat lebih eksplisit, dengan
reinterpret_cast
arti "perlakukan byte ini seolah-olah mereka sudah hal lain ini". Dalam C, Anda dapat membuatnya benar-benar eksplisit dengan menggunakanunion
, casting dengan(type)
operator akan berusaha untuk menjaga hasil yang setara secara numerik, hingga kehilangan presisi.sumber
int*
yang satu kata danchar*
yang dua kata [dengan byte kedua memilih byte kata yang tinggi atau rendah]. Casting(int*)
ke to(char*)
akan membutuhkan penambahan kata tambahan yang harus berupa nilai berapa pun yang menentukan byte pertama dariint
.