2013-04-24 6 views
9

Często wiadomo, że wartości są dodatnie. Na przykład numer sekwencji TCP/UDP jest zawsze wartością dodatnią. Zarówno int, jak i unsigned int są wystarczająco duże, aby pomieścić nawet największy sequence number, więc mogę używać dowolnego z tych typów. Istnieje wiele innych przykładów, gdy wartości są pozytywne.Czy powinienem używać "unsigned" za każdym razem, gdy wiem, że przetwarzam niepodpisane wartości?

Czy są jakieś powody, aby używać typu unsigned, gdy pojemność zwykłego modelu signed jest wystarczająca (i często więcej niż wystarczająca)?

Osobiście staram się używać zwykłych typów, ponieważ:

  • int jest chyba trochę bardziej czytelne niż uint lub unsigned int
  • I nie muszą zawierać dodatkowe nagłówki UINT itp
  • Unikać dodatkowych rzutów gdzieś dalej w programie

Powodów do korzystania z unsigned typ I mogę sobie wyobrazić:

  • pomoc kompilator wygenerował lepszy kod?
  • pomóc innym programista zrozumieć, że zmienna jest unsigned
  • uniknąć ewentualnych błędów (na przykład, gdy int jest przypisany do UINT kompilator prawdopodobnie wygeneruje błąd kompilacji i powinniśmy sprawdzić tę wartość możemy przypisać nie jest ujemna)
+0

Kilka przemyśleń na ten temat tutaj: http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers/ – Morwenn

+1

dzięki, również znalazłem to pytanie właśnie teraz http://stackoverflow.com/questions/12225521/should-unsigned-ints-be-used-if-not-necessary?rq= 1 – javapowered

+1

Nie. Istnieją pewne argumenty przemawiające za używaniem 'unsigned' - Stroustrup nawiązuje do tego przy okazji w języku programowania C++ gdzieś - Lakos odszedł i napisał rozdział na ten temat w jednej ze swoich książek: nużącej. Przykładowe problemy: jeśli masz wartości a i b, 'abs (a-b)' działa intuicyjnie dla ints, ale nie bez znaku; Warto zauważyć, że konwersje standardowe mogą być wykonywane cicho, więc kontrole, które można uzyskać, korzystając z funkcji unsigned, i tak nie działają - wartości ujemne stają się po cichu ogromne i na odwrót. –

Odpowiedz

1

Jednym z powodów jest to, że porównywanie podpisanych i niepodpisanych numerów może prowadzić do zaskakujących wyników. W języku C i (jak sądzę) w C++ porównanie liczb podpisanych i niepodpisanych powoduje, że podpisany numer interpretowany jest jako niepodpisany. Jeśli podpisana wartość ma wartość ujemną, odczytanie jej jako niepodpisanej da WIĘKSZĄ wartość niż jakikolwiek niepodpisany numer, co nie jest tym, czego potrzebujesz. Zobacz przykład this question dla przykładu w Objective-C, który używa tych samych zasad konwersji co C.

Powiązane problemy