Döküm ne demektir?


18

CI gibi düşük seviyeli dillerde kodlama yaparken, dökümün bazen 'bu baytları her zaman bu diğer türdeymiş gibi yeniden yorumlamak' anlamına gelirken, diğer zamanlarda 'bu değeri akıllıca bu diğer türe dönüştürün' anlamına gelir.

Sözcüğün orijinal anlamı nedir ve ne zaman bir dönüşüm bekleneceği ve ne zaman bir ham yorumlamanın bekleneceği konusunda herhangi bir tutarlılık var mı?


ne var Wikipedia makalesinde anlamıyorsun değil mi? " tür dönüştürme , yazım ve zorlama , bir veri türündeki bir öğeyi başka bir veri türüne dolaylı veya açık bir şekilde değiştirmenin farklı yollarıdır ... Her programlama dilinin türlerin nasıl dönüştürülebileceğine ilişkin kendi kuralları vardır ..."
gnat

"Yayınlamak" için orijinal anlamın programlama ile hiçbir ilgisi yoktur, buraya bakınız merriam-webster.com/dictionary/cast
Doc Brown

1
Eric
Lippert'in

1
@gnat: Bunun ciddi bir soru mu yoksa sadece trolling girişimi mi olduğundan emin değilim. Ama derleyicinin ne yapacağını bilmek istiyorum: dönüştürme, döküm veya zorlama? Temel kurallar nelerdir?
Alexander Torstling

1
@DocBrown Bence castbilgisayar anlamında terim metalurji anlamında dökümle daha benzer , böylelikle bir kalıba dökülürken erimiş bir metalin şekli yenileniyor : britannica.com/EBchecked/topic/377665/metallurgy/81884/Casting
KChaloux

Yanıtlar:


10

C'de yayın yapmak diğer dillerden farklı olarak benzersizdir. Asla akıllı değildir.

C harfiyle döküm, değerleri dikkatlice tanımlanmış kuralları kullanarak bir türden diğerine dönüştürür. Gerçekten bilmeniz gerekiyorsa, standardı okuyun. Aksi takdirde ana noktalar:

  1. Tamsayı türleri arasındaki dönüşüm mümkünse değeri korur. Hedefin daha fazla biti varsa, bu genişler ve genellikle güvenlidir, ancak işaret uzatması içerebilir. Daha dar olursa, bitler kaybolacaktır.
  2. İşaretçi türleri arasındaki dönüştürme işaretçi değerini korur, ancak sonuçlar genellikle tanımsızdır, genellikle taşınabilir değildir ve genellikle gelişmiş senaryolar için kullanışlıdır.
  3. Tamsayı türleri ve işaretçiler arasındaki dönüşüm, tamsayı yeterince büyükse ve bit desenini (ne anlama geliyorsa) koruyorsa, sorun olmaz. Tam sayı çok küçükse, sonuç tanımsızdır, ancak yararlı değildir. Kural olarak 'uzun', 'boşluk *' için yeterince geniştir ancak garanti yoktur! Bu şekilde oluşturulan işaretçiler her türlü ilginç şekilde geçersiz olabilir.
  4. Kayan nokta ve tamsayı türleri arasındaki dönüşüm, uygun bir kütüphane rutini tarafından tanımlandığı gibi aritmetik dönüşümlerdir (yuvarlama ile değil, kesilerek).
  5. Bir işlevin dönüş değerini geçersiz kılabilirsiniz. Asla sahip değilim. Hiçbir şey yapmaz.

Bazı yayınlar dolaylı olarak uygulanır ve bazılarında derleyici bir uyarı verir. En iyi uyarıları dikkate almak!

Cast için sözlük tanımı, yararsız olduğu için en iyi şekilde göz ardı edilir. Birçok yayın, dönüşüm veya baskı terimleriyle daha iyi tanımlanır, bu yüzden bunları da bilmeye değer.

C ++ ÇOK daha karmaşık, ama bunu sormadınız, değil mi?


Küçük kurallarla ilgileniyorum ve küçük ayrıntılarla değil, ama şeyleri temizlemeye yardımcı olursa C'den başka dillerle ilgileniyorum.
Alexander Torstling

2
Burada verdiğim kadar makul genel. Gerçek, düşük seviyeli profesyonel C / C ++ kodu yazmak için minik detay kritik öneme sahiptir. Çoğu dilde tür dönüşümlerinde bu tür bir sorun yoktur. Sorununuzu çözmezse özür dileriz.
david.pfx

Dönüştürme dışında T*için void*geri ve her zaman iyi tanımlanmış olduğunu.
Miles Rout

@Miles: Aslında, orijinal işaretçi değerini korumak için T * 'yi herhangi bir U * ve arkaya dönüştürmek gerekir. Cevabımda sadece kısa tutmak için 'genellikle tanımsız' dedim, çünkü bazı detaylar çok dağınık.
david.pfx

1
@supercat: Bkz. n1570 S6.3.2.3. T *, U * ve void * arasında dönüştürme / yuvarlak açma, yalnızca bir istisna dışında işaretçi değerini korur. Herhangi bir T * doğru şekilde hizalanmamışsa, tanımsız davranıştır. Demek istediğim, ama bu ölçüde.
david.pfx

2

Webster sözlüğünün bu kısmı doğru tanımı verir:

a: sıvı veya plastik formda bir kalıba dökülerek ve basınçsız sertleşmeye izin vererek (bir maddeye) şekil vermek
b: bu işlemle oluşması

Yani, yayınlamadan önce, "nesneniz" (kelimenin tam anlamıyla bir OOP nesnesi değil) belirli bir şekle (tip) sahiptir. Yeniden döktüğünüzde, onu yeni bir şekle dönüştürmek için etrafına "beton dökün", döküm ile yaptığınız şey budur. Altıgen şeklinde bir tamsayı olarak bir sayınız var ve dökümden sonra dikdörtgen şeklinde bir dize alacaksınız.


2
Ayrıca : "(Bir aktöre) belirli bir rol atamak".
Kelly Thomas

Evet. Eminim bu en iyisidir. +1.
david.pfx

2

C kalıplarını iki gruba ayırmak yararlı olabilir:

  1. Sayısal yayınlar - değeri tutmaya çalışarak bir sayıyı bir temsiliyete diğerine dönüştürür. Örneğin - (int)3.1olurdu 3. Kesin değer korunamadığında ne olacağını tanımlayan kesin kurallar vardır.

  2. İşaretçi atma - Bellek adresini koruyun, ancak kayıttan çıkarılma şeklini değiştirin. İçin, örneğin float x=3.5, *(int *)&xverecek 1080033280- bu tamsayı şamandıra temsil aynı bit modeli ile temsil edilir 3.5.


Keep the memory address, but change the way it's dereferenced.Yazılı olarak işaretlenmiş bir işaretçinin kaydının kaldırılması tanımlanmamıştır. Standart yalnızca geri ve arkadan yayın A *yapmayı garanti eder , bu da ilk etapta dereference için geçerli olmayabilir - veya a ise herhangi bir türün nesne temsilini okumak için kullanılabilir. Diğer tüm türler için, kayıt silme işaretçisinin türü kısıktır, UB'dir ve katı takma adı ihlal eder. Her neyse, derleyici bu nedenle yukarıdaki örnek 2'yi çöpe atmasa bile, bit desenleri hakkında kaydedilemez varsayımlar yapıyorsunuzB *A *B *char *B *
underscore_d

1
cast (v): to receive form in a mold

C ++ 'da çeşitli türler daha açık hale getirilebilir, reinterpret_castyani "bu baytlara zaten başka bir şeymiş gibi davran". C ile bunu a kullanarak kesin olarak açık hale getirebilirsiniz union. (type)Operatörle döküm yapmak, kesinti kaybına kadar sonucu sayısal olarak eşdeğer tutmaya çalışır.


2
C işaretçi kalıpları her zaman yeniden yorumlanır ve değer kalıpları her zaman değeri mümkün olan en iyi şekilde korur. C ++ 'da işaretçi döküm yapmanın birden çok yolu vardır, bu yüzden daha açık döküm türleri vardır.
Jan Hudec

C işaretçi semantiği semantiklerin mutlaka "yeniden yorumlanması" gerekmez. Kelime adresleme kullanan ancak bayt tabanlı kodla int*bir kelime ve char*iki kelime olan [ikinci bayt bir kelimenin yüksek veya düşük baytını seçerek) sahip olmak için güzel bir şekilde etkileşim kurmak isteyen bir işlemci için meşru olacaktır . Bir " (int*)to" (char*)değeri atamak, değerinin ilk baytını belirtecek herhangi bir değer olması gereken ek bir sözcüğün eklenmesini gerektirir int.
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.