Kiedy używać niepodpisanych wartości podpisanych przez nich?

głosy
66

Gdy jest to właściwe wykorzystanie zmiennej unsigned nad podpisem jednego? Co w forpętli?

Słyszałem wiele opinii o tym i chciałem zobaczyć, czy jest coś przypominającego konsensusu.

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

Wiem, że Java nie ma wartości bez znaku, a to musiało być dobrze chroniony decyzja o Sun Microsystems części.

Utwórz 02/08/2008 o 04:34
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
61

Ucieszyłem się, aby znaleźć dobrą rozmowę na ten temat, bo tak naprawdę nie biorąc pod uwagę, że wiele myśli wcześniej.

Podsumowując, podpisany jest dobry ogólny wybór - nawet gdy jesteś martwy, czy wszystkie numery są pozytywne - jeśli masz zamiar zrobić arytmetyczne na zmiennych (jak w typowym dla przypadku pętla).

Jeśli masz zamiar zrobić bitowe rzeczy jak maski, rozpoczyna niepodpisane więcej sensu. Lub, jeśli jesteś zdesperowany, aby uzyskać ten dodatkowy pozytywny zakres, korzystając z bitem znaku.

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

Odpowiedział 02/08/2008 o 04:49
źródło użytkownik

głosy
8

W przykładzie powyżej, gdy „ja” zawsze będzie dodatni i większy zakres byłoby korzystne, unsigned byłaby przydatna. Podobnie jak w przypadku korzystania z oświadczenia „stwierdzenie”, takich jak:

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

Zwłaszcza, gdy wartości te nigdy się nie zmieni.

Jednakże, jeśli robisz program księgowy, gdzie ludzie są nieodpowiedzialni z ich pieniędzy i ciągle na minusie, będzie z całą pewnością chcesz używać „podpisane”.

Zgadzam się z świętego mimo że dobra zasada jest użycie podpisany, którym C faktycznie domyślnie, więc jesteś pokryte.

Odpowiedział 02/08/2008 o 05:31
źródło użytkownik

głosy
6

size_tjest często dobrym wyborem do tego, lub size_typejeśli używasz klasy STL.

Odpowiedział 02/08/2008 o 06:51
źródło użytkownik

głosy
7

Kompilatory C i C ++ wygeneruje ostrzeżenie, jeśli porównać podpisane i niepodpisane rodzaje; w przykładowym kodzie, nie można dokonać pętli zmienna unsigned i mieć kompilator kodu bez ostrzeżeń generować (zakładając, że ostrzeżenia były włączone).

Naturalnie, jesteś kompilacji z ostrzeżeniami zwrócił całą drogę w górę, prawda?

I Czy za kompilowanie z „traktuje ostrzeżenia jako błędy”, aby przyjąć, że jeden krok dalej?

Minusem z użyciem podpisane liczb jest to, że istnieje pokusa, aby przeładowywać je tak, że na przykład, wartości 0-> n to wybór menu, a -1 oznacza nic się nie wybiera - zamiast tworzenia klasy, która ma dwie zmienne, jedną do wskazać, czy jest wybrana i coś innego, aby zapisać, że wybór jest. Zanim się zorientujesz, jesteś testowania dla negatywnej wszędzie i kompilator narzeka jak jesteś chcąc porównać menu wyboru przed liczby opcji menu trzeba - ale to jest niebezpieczne, ponieważ są one różne rodzaje , Więc nie rób tego.

Odpowiedział 04/08/2008 o 14:35
źródło użytkownik

głosy
7

Myślę, że jeśli sprawa biznesu mówi, że liczba ujemna jest nieważny, byś chciał mieć błąd pokazany lub wyrzucane.

Mając to na uwadze, że dopiero niedawno dowiedział się o liczby całkowite bez znaku podczas pracy na projekt przetwarzania danych w pliku binarnego i przechowywania danych w bazie danych. Byłem celowo „zgorszenie” dane binarne, a skończyło się wartości ujemne zamiast oczekiwanego błędu. Okazało się, że mimo iż wartość przekształca wartość nie była ważna dla mojego przypadku biznesowego.
Mój program nie błąd, a skończyło się błędne dane do bazy danych. Byłoby lepiej, gdybym użył uinti miał program niepowodzeniem.

Odpowiedział 10/11/2008 o 20:04
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more