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 int
ve sonra onu atayacaktır a
. Daha unsigned long
fazla 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, ~0
tüm bitleri tersine çevirmek zorunda olmasıdır. Tersine çevirme, -1
ikinin 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 a
sı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. a
Mümkün olan en yüksek değere başlamak için ihtiyacınız olan değer -1
veya UINT_MAX
. İkinci tipine bağlıdır a
- Kullanmak gerekecektir ULONG_MAX
bir 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 ~0
bütün bitleri bir (elbette vardır) sahiptir.
Ancak bahsettiğimiz şey, başlatılmış flags
değişkenin sonucunun ne olduğu. Ve bunun için sadece-1
her tür ve makineyle çalışacaktır.