Kiedy używać wartości niepodpisanych nad podpisanymi?

Kiedy właściwe jest użycie zmiennej niepodpisanej zamiast zmiennej podpisanej? A w pętli for?

Słyszałem wiele opinii na ten temat i chciałem zobaczyć, czy jest coś podobnego do konsensusu.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Wiem, że Java nie ma niepodpisanych wartości, a to musiała być przemyślana decyzja Sun Microsystems' część.

Author: Peter Mortensen, 2008-08-02

5 answers

Cieszyłem się, że znalazłem dobrą rozmowę na ten temat, ponieważ nie myślałem o tym zbyt wiele wcześniej.

Podsumowując, signed jest dobrym ogólnym wyborem - nawet jeśli masz pewność, że wszystkie liczby są dodatnie-jeśli zamierzasz wykonać arytmetykę na zmiennej(jak w typowym przypadku pętli).

Jeśli zamierzasz robić bitowe rzeczy, takie jak maski, niepodpisane zaczyna mieć większy sens. Lub, jeśli jesteś zdesperowany, aby uzyskać ten dodatkowy pozytywny zakres, wykorzystując znaku.

Osobiście lubię podpisywać, bo nie ufam sobie, aby zachować spójność i uniknąć mieszania dwóch typów (jak artykuł ostrzega przed).

 69
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 03:49:21

W powyższym przykładzie, gdy 'i' zawsze będzie pozytywne, a wyższy zakres będzie korzystny, użyteczny będzie niepodpisany. Na przykład, jeśli używasz poleceń 'declare', takich jak:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Szczególnie, gdy te wartości nigdy się nie zmienią.

Jednakże, jeśli robisz program księgowy, w którym ludzie są nieodpowiedzialni ze swoimi pieniędzmi i są stale na Czerwono, zdecydowanie będziesz chciał użyć "podpisanego".

[[1]}zgadzam się ze Świętym choć, że dobra zasada thumb to użycie signed, które C faktycznie domyślnie, więc jesteś objęty.
 10
Author: helloandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 04:31:54

Myślę, że jeśli twój przypadek biznesowy nakazuje, że liczba ujemna jest nieważna, to Chcesz , Aby został pokazany lub wyrzucony błąd.

Mając to na uwadze, dopiero niedawno dowiedziałem się o niepodpisanych liczbach całkowitych podczas pracy nad projektem przetwarzającym dane w pliku binarnym i przechowującym je w bazie danych. Celowo "korumpowałem" dane binarne i ostatecznie otrzymałem wartości ujemne zamiast oczekiwanego błędu. Stwierdziłem, że mimo że wartość przeliczona, wartość nie była ważna dla mojego przypadku biznesowego.
Mój program nie popełnił błędu, a skończyło się na tym, że otrzymałem błędne dane do bazy danych. Byłoby lepiej, gdybym użyła uint i zawiodła program.

 9
Author: Keith Sirmons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 15:24:44

Kompilatory C i C++ generują ostrzeżenie podczas porównywania typów signed i unsigned; w przykładowym kodzie nie można zmienić zmiennej pętli na unsigned, a kompilator generuje kod bez ostrzeżeń (zakładając, że ostrzeżenia zostały włączone).

Naturalnie, kompilujesz z ostrzeżeniami, które są ustawione w górę, prawda?

A czy rozważałeś kompilację z "traktuj ostrzeżenia jako błędy", aby pójść o krok dalej?

Minusem używania signed liczby polega na tym, że istnieje pokusa przeciążenia ich tak, że na przykład wartości 0->n są zaznaczeniem menu, a -1 oznacza, że nic nie jest zaznaczone - zamiast tworzyć klasę, która ma dwie zmienne, jedna wskazuje, czy coś jest zaznaczone, a druga przechowuje to, co jest zaznaczone. Zanim się zorientujesz, testujesz na negatywną, a kompilator narzeka na to, jak chcesz porównać wybór menu z liczbą dostępnych wyborów menu - ale to niebezpieczne, bo to różne typy. Więc nie rób tego.

 8
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 13:35:41

size_t jest często dobrym wyborem do tego, lub size_type, Jeśli używasz klasy STL.

 6
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-23 17:27:58