En basit olanı olduğu için tam olarak gösterdiğiniz gibi yapmanızı tavsiye ederim. Gerçek işaret temsilinden bağımsız olarak her zaman-1 işe yarayacak olanı başlatın , ancak bazen şaşırtıcı davranışlara sahip olursunuz çünkü doğru işlenen türüne sahip olmanız gerekir. Ancak o zaman bir türün en yüksek değerini elde edersiniz .~unsigned
Olası bir sürpriz örneği için şunu düşünün:
unsigned long a = ~0u;
Tüm bitleri 1 olan bir kalıbı mutlaka saklamaz a. Ama önce bir içindeki tüm bitleri 1 olan bir model oluşturacak unsigned intve sonra onu atayacaktır a. Daha unsigned longfazla bit olduğunda olan şey, bunların hepsinin 1 olmamasıdır.
Ve iki olmayanın tümleyen temsilinde başarısız olacak olan şunu düşünün:
unsigned int a = ~0; // Should have done ~0u !
Bunun nedeni, ~0tüm bitleri tersine çevirmek zorunda olmasıdır. Tersine çevirme, -1ikinin tamamlayıcı makinesinde (ihtiyacımız olan değer bu!) Sonuç verecek , ancak başka bir temsilde sonuç vermeyecektir-1 . Birinin tamamlayıcı makinesinde sıfır verir. Böylece, birinin tamamlayıcı makinesinde yukarıdakiler asıfıra başlayacaktır .
Anlamanız gereken şey, her şeyin değerlerle ilgili olmasıdır - bitlerle değil. Değişken bir değer ile başlatılır . Başlatıcıda, başlatma için kullanılan değişkenin bitlerini değiştirirseniz, değer bu bitlere göre üretilecektir. aMümkün olan en yüksek değere başlamak için ihtiyacınız olan değer -1veya UINT_MAX. İkinci tipine bağlıdır a- Kullanmak gerekecektir ULONG_MAXbir için unsigned long. Ancak, ilki türüne bağlı olmayacak ve en yüksek değeri elde etmenin güzel bir yoludur.
Biz edilir değil olmadığı hakkında konuşurken -1(her zaman sahip değildir) tüm bitlerini birine sahiptir. Ve biz konum değil olmadığı hakkında konuşurken ~0bütün bitleri bir (elbette vardır) sahiptir.
Ancak bahsettiğimiz şey, başlatılmış flagsdeğişkenin sonucunun ne olduğu. Ve bunun için sadece-1 her tür ve makineyle çalışacaktır.