SORU
30 NİSAN 2009, PERŞEMBE


Güvenli -1 true tüm bitlerini ayarlamak için kullanılır mı?

Bu deseni C & C çok kullanıldığını gördüm .

unsigned int flags = -1;  // all bits are true

Bu iyi taşınabilir bir şekilde bunu yapmak için? Veya daha iyi 0xffffffff ~0 kullanıyor?

CEVAP
30 NİSAN 2009, PERŞEMBE


En düz ileri bir yana tam olarak gösterildiği gibi yapmanızı tavsiye ederim,. Çalışacak -1 başlatılamıyorher zaman, ~ bazen doğru işlenen bu tür olması gerekir, çünkü şaşırtıcı bir davranış olacaktır ancak gerçek işareti gösterimi bağımsız. Ancak o zaman unsigned Bir tür en yüksek değerini alacak.

Olası bir örnek için sürpriz, bu bir düşünün:

unsigned long a = ~0u;

Mutlaka a tüm parçaları ile bir desen 1 mağaza değil. Ama önce tüm bitleri unsigned int, 1 ile bir model oluşturur ve sonra a atamak. unsigned long daha fazla bit varsa ne olur bunların hepsi 1.

Ve olmayan iki başarısız olacak bu bir düşünün, tamamlayıcı gösterimi:

unsigned int a = ~0; // Should have done ~0u !

Bunun nedeni ~0 tüm bitleri ters çevirmek için olmasıdır. İki -1 verecektir eviren tamamlayıcı makine (ihtiyacımız olan değerdir!), ama olacakdeğilbaşka bir temsili -1 verim. Bir birinin tamamlayıcısı makinesi, sıfır verir. Böylece, bir birinin tamamlayıcısı makine, yukarıda a sıfır başlatılacaktır.

Anlamanız gereken şey değerleri - bit yok. Bu değişken ile başlatıldıdeğer. Başlatıcı değişken bit başlatma için kullanılan değiştirirseniz, değer bu bit göre oluşturulur. Gereken değeri, mümkün olan en yüksek değeri a başlatmak için, -1 UINT_MAX. İkinci a *ile 24* ULONG_MAX kullanmak gerekir türüne bağlı olacaktır. Ancak, ilk kendi türüne bağlıdır ve en yüksek değeri almanın güzel bir yolu var.

Bizdeğil-1 olup olmadığı hakkında konuşurken bir (her zaman değil) bit vardır. Ve ediyoruzdeğil~0 olup olmadığı hakkında konuşurken (elbette vardır) bit vardır.

Ama bahsettiğimiz şey flags başlatılmamış değişkenin sonucudur. Ve bunun için,sadece -1her tip ve makine ile çalışacak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 0TACTICAL0HIPPY0

    0TACTICAL0HI

    30 EYLÜL 2012
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • gadgetgal38

    gadgetgal38

    9 HAZİRAN 2009