Podpisanie - Signedness

W informatyce znakowanie jest właściwością typów danych reprezentujących liczby w programach komputerowych. Zmienna numeryczna jest ze znakiem, jeśli może reprezentować zarówno liczby dodatnie, jak i ujemne , a bez znaku, jeśli może reprezentować tylko liczby nieujemne (liczby zerowe lub dodatnie).

Jako podpisane numery mogą reprezentować ujemnych wartości, tracą one szereg dodatnich wartości, które mogą być reprezentowane tylko bez znaku liczby tej samej wielkości (w bitach), gdyż w przybliżeniu połowa możliwych wartości są wartościami siłowo, przy czym dany typ unsigned można przeznaczyć wszystkie możliwe wartości do zakresu liczb dodatnich.

Na przykład, uzupełnienie dwójkowe podpisał 16-bitowa liczba całkowita może posiadać wartości -32768 do 32767 włącznie, natomiast 16 bitowa liczba całkowita może posiadać wartości od 0 do 65535 . W przypadku tej metody reprezentacji znaku skrajny lewy bit ( bit najbardziej znaczący ) określa, czy wartość jest dodatnia, czy ujemna (0 oznacza dodatnią, 1 oznacza ujemną).

W językach programowania

W przypadku większości architektur w języku maszynowym nie ma rozróżnienia typu ze znakiem i bez znaku . Niemniej jednak instrukcje arytmetyczne zwykle ustawiają różne flagi procesora, takie jak flaga przeniesienia dla arytmetyki bez znaku i flaga przepełnienia dla podpisu. Wartości te mogą być brane pod uwagę przez kolejne polecenia gałęziowe lub arytmetyczne.

Język programowania C wraz z jego pochodnymi implementuje znakowanie dla wszystkich typów danych całkowitych , a także dla "character" . W przypadku liczb całkowitych modyfikator unsigned definiuje typ, który ma być bez znaku. Domyślną liczbą całkowitą signedness jest podpisana, ale można ustawić bezpośrednio z podpisanego modyfikatora. Natomiast standard C deklaruje signed char , unsigned char i char , jako trzy różne typy, ale określa, że ​​wszystkie trzy muszą mieć ten sam rozmiar i wyrównanie. Co więcej, char musi mieć ten sam zakres liczbowy, co signed char lub unsigned char , ale wybór zależy od platformy. Literały całkowite mogą być bez znaku z sufiksem U. Na przykład 0x FFFFFFFF daje -1, ale 0xFFFFFFFFFU daje 4 294 967 295 dla kodu 32-bitowego.

Kompilatory często wysyłają ostrzeżenie, gdy dokonywane są porównania między liczbami podpisanymi i niepodpisanymi lub gdy jedna jest rzutowana na drugą. Są to potencjalnie niebezpieczne operacje, ponieważ zakresy typów podpisanych i niepodpisanych są różne.

Zobacz też

Linki zewnętrzne

  • "Przegląd typów numerycznych" . Podręcznik MySQL 5.0 . mysql.com. 2011 . Źródło 6 stycznia 2012 .
  • „Zrozumienie reguł konwersji liczb całkowitych” , CERT C Coding Standard , Computer Emergency Response Team , pobrane 31 grudnia 2015 r.