SORU
17 ŞUBAT 2015, Salı


Neden farklı davranır tamamlayıcı printf geçer?

Bit operatörleri üzerine bir bölüm okuyordum, üzerinden 1 tamamlayıcı operatör programı geldim ve Visual C üzerinde çalıştırmak için karar verdi .

int main ()
{
   unsigned char c = 4, d;
   d = ~c;
   printf("%d\n", d);
}

Geçerli bir çıktı verir: 251

~c, değerini tutacak bir değişken olarak d kullanmak yerine doğrudan ~c değerini yazdırmaya karar verdim.

int main ()
{
   unsigned char c=4;
   printf("%d\n", ~c);
}

Çıkış -5 verir.

Neden işe yaramadı?

CEVAP
17 ŞUBAT 2015, Salı


Bu ifade

printf("%d",~c);

c int dönüştürülür1yazınönce~ (bit düzeyinde tamamlayıcı) operatörü uygulanır. Bu olduğu içintamsayı promosyonlaro ~ işleneni için çağrılır. Bu durumda, bir nesnenin unsigned char tip terfi için (imzalı) int daha sonra (sonra ~ operatör değerlendirme) tarafından kullanılan printf fonksiyonu ile eşleşen %d biçim belirleyicisi.

Dikkat edinvarsayılan argüman promosyonlarprintf variadic bir fonksiyonu olarak herhangi bir rol oynamıyor, nesne zaten tip olarak int.

Bu kod, diğer taraftan:

unsigned char c = 4, d;
d = ~c;
printf("%d", d);

aşağıdaki adımlar gerçekleşir:

  • c bir konutamsayı promosyonlarçünkü ~ (yukarıda açıklandığı gibi aynı şekilde)
  • ~c rvalue (imzalı) int değer (*28 örneğin*) olarak değerlendirilir
  • d=~c d Bu tip gibi unsigned char int örtülü bir dönüştürme yapar. d = (unsigned char) ~c aynı olarak düşünebilirsiniz. d negatif (bu imzasız tüm türleri için genel kuraldır) olamaz dikkat edin.
  • printf("%d", d); çağırırvarsayılan argüman promosyonlarböylece d int dönüştürülür ve (negatif olmayan) değeri (yani int tipi unsigned char tüm değerleri temsil edebilir türü) korunur.

1) int varsayarsak unsigned char tüm değerler (T. C. comment aşağıya bakınız) temsil edebilir, ama öyleçokbu şekilde gerçekleşmesi Olası. Daha spesifik olarak, INT_MAX >= UCHAR_MAX tutan varsayıyoruz. Genellikle sizeof(int) > sizeof(unsigned char) tutar ve bayt sekiz bit içerir. Aksi takdirde c olurdu dönüştürülür unsigned int (olarak tarafından C11 bendi §6.3.1.1/p2), ve biçimini belirleyici olması da değişti buna göre %u önlemek için almak bir İK (C11 §7.21.6.1/p9).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • Matt Harding

    Matt Harding

    23 Mayıs 2006