Korkunç Yanıtlar Galore
Özgür Özçitak
İmzalıdan imzasıza (ve tersi) atadığınızda, numaranın dahili gösterimi değişmez. Değişen şey, derleyicinin işaret bitini nasıl yorumladığıdır.
Bu tamamen yanlış.
Mats Fredriksson
Bir imzasız ve bir imzalı değişken eklendiğinde (veya herhangi bir ikili işlem) her ikisi de örtük olarak imzasıza dönüştürülür, bu durumda büyük bir sonuç elde edilir.
Bu da yanlış. İmzasız tipler, imzasız tipteki dolgu bitleri nedeniyle eşit hassasiyete sahip oldukları takdirde ints'e yükseltilebilir.
brisbanetimes
Ekleme işleminiz int öğesinin imzasız int biçimine dönüştürülmesine neden olur.
Yanlış. Belki öyle, belki de değil.
İmzasız int'ten işaretli int'e dönüşüm uygulamaya bağlıdır. (Ancak bugünlerde çoğu platformda beklediğiniz gibi çalışıyor.)
Yanlış. Taşmaya neden oluyorsa veya değer korunuyorsa tanımsız bir davranıştır.
Anonim
İ değeri imzasız int dönüştürülür ...
Yanlış. İmzasız bir int'e göre int'nin hassasiyetine bağlıdır.
Taylor Price
Daha önce yanıtlandığı gibi, imzalı ve imzasız arasında sorunsuz bir şekilde ileri ve geri gidebilirsiniz.
Yanlış. İşaretli bir tam sayı aralığının dışında bir değer depolamaya çalışmak tanımsız davranışa neden olur.
Şimdi nihayet soruya cevap verebilirim.
İnt kesinliği imzasız int değerine eşitse, u imzalı bir int değerine yükseltilir ve ifadeden -4444 değerini alırsınız (u + i). Şimdi, u ve ben başka değerlere sahipseniz, taşma ve tanımsız davranış alabilirsiniz, ancak bu kesin sayılarla -4444 alacaksınız [1] . Bu değer int türüne sahip olacaktır. Ancak bu değeri imzasız bir int'de depolamaya çalışıyorsunuz, böylece imzasız bir int'e yayınlanacak ve sonuçta elde edilen değer (UINT_MAX + 1) - 4444 olacaktır.
İmzasız int'in kesinliği int'den daha büyükse, imzalı int diğer imzasız int 1234'e eklenecek olan (UINT_MAX + 1) - 5678 değerini veren imzasız bir int'e yükseltilecektir. ifadeyi {0..UINT_MAX} aralığının dışında yapan diğer değerler (UINT_MAX + 1) değeri, sonuç {0..UINT_MAX) aralığına girene ve tanımlanmamış bir davranış gerçekleşmeyene kadar eklenecek veya çıkarılacaktır. .
Hassasiyet nedir?
Tamsayıların dolgu bitleri, işaret bitleri ve değer bitleri vardır. İmzasız tamsayıların açık bir şekilde işaret biti yoktur. İmzasız karakterin ayrıca dolgu biti olmaması garanti edilir. Bir tamsayının sahip olduğu bit sayısı, ne kadar hassasiyete sahip olduğudur.
[Sorunlar]
Dolgu bitleri mevcutsa, tek başına makro boyutu makrosu bir tamsayının kesinliğini belirlemek için kullanılamaz. Ve bir baytın büyüklüğünün, C99 tarafından tanımlanan bir sekizli (sekiz bit) olması gerekmez.
[1] Taşma iki noktadan birinde meydana gelebilir. Eklemeden önce (tanıtım sırasında) - int içine sığmayacak kadar büyük imzasız bir intiniz olduğunda. Taşma ayrıca, imzalanmamış int bir int aralığında olsa bile ekleme işleminden sonra ortaya çıkabilir, ekleme işleminden sonra sonuç yine de taşabilir.