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
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ğerlendirilird=~c
d
Bu tip gibiunsigned 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öyleced
int
dönüştürülür ve (negatif olmayan) değeri (yaniint
tipiunsigned 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).
Neden C# farklı iki int dizi sözdizimi...
C ve C her ikisi içinde geçerli bir ko...
Neden Python karşılaştırma dizeleri ku...
Neden toplam sırasını değiştirerek far...
Neden Java bize bir isim dosya adından...