Co to jest znak unsigned?

W C/C++, do czego służy unsigned char? Czym się różni od zwykłego char?

 405
Author: Kirill Kobelev, 2008-09-16

17 answers

W C++ istnieją trzy odrębne typy znaków:

  • char
  • signed char
  • unsigned char

Jeśli używasz typów znaków dla tekstu , użyj niekwalifikowanego char:

  • jest to typ literałów znaków, takich jak 'a' lub '0'.
  • jest to typ, który tworzy ciągi C jak "abcde"

Działa również jako wartość liczbowa, ale nie jest określone, czy ta wartość jest traktowana jako signed czy niepodpisany. Uważaj na porównywanie postaci poprzez nierówności-chociaż jeśli ograniczysz się do ASCII (0-127), jesteś prawie bezpieczny.

Jeśli używasz typów znaków jako liczb , użyj:

  • signed char, co daje co najmniej zakres od -127 do 127. (-128 do 127 jest często)
  • unsigned char, co daje co najmniej zakres od 0 do 255.

"przynajmniej", ponieważ standard C++ podaje tylko minimalny zakres wartości, które każdy typ numeryczny jest wymagany do pokrycia. sizeof (char) musi być 1 (tzn. jeden bajt), ale bajt teoretycznie może być na przykład 32 bity. sizeof nadal będzie zgłaszać jego wielkość jako 1 - to znaczy, że ty mógłbyś mieć sizeof (char) == sizeof (long) == 1.

 491
Author: Fruny,
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
2014-10-24 03:42:23

Jest to zależne od implementacji, ponieważ standard C nie definiuje signed-ness char. W zależności od platformy, char może być signed lub unsigned, więc musisz wyraźnie poprosić o signed char lub unsigned char, jeśli zależy od tego twoja implementacja. Po prostu użyj char, jeśli zamierzasz reprezentować znaki z łańcuchów, ponieważ będzie to pasować do tego, co Platforma umieszcza w łańcuchu.

Różnica między signed char i unsigned char jest taka, jak można się spodziewać. Na większości platform, signed char będzie 8-bitową dwójką liczba dopełniacza w zakresie od -128 do 127, a unsigned char będzie 8-bitową niepodpisaną liczbą całkowitą (0 do 255). Uwaga standard nie wymaga, aby typy char miały 8 bitów, tylko że sizeof(char) zwracają 1. Można uzyskać liczbę bitów w znaku z CHAR_BIT W limits.h. Istnieje kilka, jeśli jakieś platformy dzisiaj, gdzie będzie to coś innego niż 8, choć.

Tu jest ładne podsumowanie tego numeru .

Jak wspominali inni odkąd zamieściłem to, lepiej użyć int8_t i uint8_t, jeśli naprawdę chcesz reprezentować małe liczby całkowite.

 78
Author: tgamblin,
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
2014-12-02 17:57:55

Ponieważ czuję, że jest to naprawdę potrzebne, chcę tylko podać pewne zasady C i C++ (są one takie same pod tym względem). Po pierwsze, wszystkie bity z unsigned char biorą udział w określaniu wartości dowolnego obiektu unsigned char. Po drugie, {[1] } jest wyraźnie określone jako niepodpisane.

Teraz miałem dyskusję z kimś o tym, co się dzieje, gdy konwertujesz wartość -1 typu int na unsigned char. Odrzucił pomysł, że wynik unsigned char ma wszystkie bity ustawione na 1, ponieważ martwił się o reprezentacji znaku. Ale nie musi. Od razu wynika z tej reguły, że konwersja robi to, co jest zamierzone: {]}

Jeśli nowy typ jest niepodpisany, wartość jest konwertowana przez wielokrotne dodawanie lub odejmowanie o jeden więcej niż maksymalna wartość, która może być reprezentowana w nowym typie dopóki wartość nie znajdzie się w zakresie nowego typu. ({[6] } w projekcie C99)

To matematyczny opis. C++ opisuje go w kategoriach rachunku modulo, co podlega tej samej zasadzie. W każdym razie, co jest Nie gwarantowane jest to, że wszystkie bity w liczbie całkowitej -1 są jednością przed konwersją. Więc co mamy, abyśmy mogli twierdzić, że wynikowe unsigned char ma wszystkie swoje CHAR_BIT bity zamienione na 1?
  1. wszystkie bity biorą udział w określaniu jego wartości - to znaczy, że w obiekcie nie występują bity dopełniające.
  2. dodanie tylko jednego czasu UCHAR_MAX+1 do -1 Da wartość w zakresie, czyli UCHAR_MAX
Wystarczy! Więc kiedy chcesz mieć unsigned char mając wszystkie jego bity jeden, robisz
unsigned char c = (unsigned char)-1;

Wynika również, że konwersja jest Nie tylko obcinaniem bitów wyższego rzędu. Szczęśliwym wydarzeniem dla dopełnienia two jest to, że jest to tylko okrojenie, ale to samo nie musi być prawdziwe dla innych reprezentacji znaków.

 35
Author: Johannes Schaub - litb,
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
2009-01-14 11:30:11

Jak na przykład użycie unsigned char :

znak unsigend jest często używany w grafice komputerowej, która bardzo często (choć nie zawsze) przypisuje pojedynczy bajt do każdego komponentu kolorów. Kolor RGB (lub RGBA) jest reprezentowany jako 24 (lub 32) bity, każdy znak unsigned char. Ponieważ wartości unsigned char mieszczą się w zakresie [0,255], wartości są zazwyczaj interpretowane jako

  • 0 oznacza całkowity brak danego koloru komponent
  • 255 oznacza 100% danego barwnika

Więc skończysz z rgb czerwony jako (255,0,0) - >(100% czerwony, 0% zielony, 0% niebieski).

Dlaczego nie użyć znaku signed char ? Arytmetyka i przesuwanie bitów staje się problematyczne. Jak już wyjaśniono, zakres znaku jest zasadniczo przesunięty o -128. Bardzo prostą i naiwną (w większości nieużywaną) metodą konwersji RGB na skalę szarości jest uśrednianie wszystkich trzech składników kolorów, ale napotyka to problemy gdy wartości składowych kolorów są ujemne. Czerwony (255, 0, 0) oznacza średnicę (85, 85, 85) przy użyciu arytmetyki unsigned char. Jeśli jednak wartości byłyby znakami signed char s (127, -128, -128), skończylibyśmy znakiem (-99, -99, -99), który byłby (29, 29, 29) w naszej unsigned char, co jest niepoprawne.

 22
Author: Zachary Garrett,
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-09-17 02:44:42

Jeśli chcesz użyć znaku jako małej liczby całkowitej, najbezpieczniejszym sposobem jest użycie typów int8_t i uint8_t.

 12
Author: jbleners,
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-08-16 12:31:51

char i unsigned char nie mają gwarancji, że będą 8-bitowe typy na wszystkich platformach-mają gwarancję, że będą 8-bitowe lub większe. Niektóre platformy mają 9-bitowe, 32-bitowe lub 64-bitowe bajty. Jednak najczęstsze platformy dzisiaj (Windows, Mac, Linux x86, itp.) mają 8-bitowe bajty.

 5
Author: bk1e,
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-09-17 05:49:54

signed char mA Zakres od -128 do 127; unsigned char mA Zakres od 0 do 255.

char będzie odpowiednikiem znaku podpisanego lub znaku niepodpisanego, w zależności od kompilatora, ale jest odrębnym typem.

Jeśli używasz ciągów w stylu C, użyj char. Jeśli musisz użyć znaków arytmetycznych (dość rzadko), określ jawnie podpisane lub niepodpisane dla przenośności.

 5
Author: James Hopkin,
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
2015-12-07 15:09:56

unsigned char przyjmuje tylko wartości dodatnie....jak 0 na 255

Gdzie jako

signed char przyjmuje zarówno wartości dodatnie, jak i ujemne....jak -128 na +127

 4
Author: munna,
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
2014-11-28 11:50:49

Unsigned char jest wartością bajtu (unsigned) (od 0 do 255). Możesz myśleć o "char" w kategoriach bycia "znak", ale jest to naprawdę wartość liczbowa. Zwykły znak" char " jest podpisany, więc masz 128 wartości i te wartości odwzorowują znaki za pomocą kodowania ASCII. Ale w obu przypadkach to, co przechowujesz w pamięci, jest wartością bajtową.

 3
Author: Zac Gochenour,
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-09-16 18:16:34

W kategoriach wartości bezpośrednich zwykły znak jest używany, gdy wartości są znane jako pomiędzy CHAR_MIN i CHAR_MAX, podczas gdy niepodpisany znak zapewnia podwójny zakres na dodatnim końcu. Na przykład, jeśli CHAR_BIT jest 8, Zakres regularny char jest gwarantowany tylko jako [0, 127] (ponieważ może być podpisany lub niepodpisany), podczas gdy unsigned char będzie [0, 255], a signed char będzie [-127, 127].

Jeśli chodzi o to, do czego jest używany, standardy pozwalają obiektom POD (plain old data) bezpośrednio konwertować do array of unsigned char. Pozwala to na sprawdzenie reprezentacji i wzorców bitowych obiektu. Ta sama gwarancja bezpiecznego znakowania nie istnieje dla znaku lub znaku podpisanego.

 3
Author: Julienne Walker,
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-08-16 12:32:27

Jeśli lubisz używać różnych rodzajów określonej długości i oznaczenia, prawdopodobnie lepiej Ci z uint8_t, int8_t, uint16_t, itp Po prostu dlatego, że robią dokładnie to, co mówią.

 2
Author: Dark Shikari,
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-09-16 18:18:46

Unsigned char jest sercem wszystkich bitowych sztuczek. W prawie wszystkich kompilatorach dla wszystkich platform znak unsigned jest po prostu bajtem. Niepodpisana liczba całkowita (Zwykle) 8 bitów. to może być traktowane jako mała liczba całkowita lub pakiet bitów.

W uzależnieniu, jak ktoś inny powiedział, norma nie definiuje znaku znaku. tak więc masz 3 różne typy "char": char, signed char, unsigned char.

 2
Author: ugasoft,
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-09-16 19:14:19

Liczby niepodpisane always positive or zero i są zgodne z laws of arithmetic modulo 2^n, Gdzie n jest liczbą w typie .

Przykład : Jeśli znaki są 8 bitów, unsigned char zmienne mają wartości pomiędzy 0 and 255, natomiast signed chars mają wartości pomiędzy -128 and 127.

 2
Author: Prateek Joshi,
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
2015-10-13 08:13:27

Jakiś googling znalazł to , gdzie ludzie dyskutowali na ten temat.

Unsigned char jest w zasadzie pojedynczym bajtem. Tak więc, możesz użyć tego, jeśli potrzebujesz jednego bajtu danych (na przykład, być może chcesz go użyć do ustawiania flag, które mają być przekazywane do funkcji, jak to często robi się w Windows API).

 1
Author: dbrien,
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-09-16 18:16:27

Unsigned char używa bitu zarezerwowanego dla znaku zwykłego znaku jako innej liczby. Zmienia to Zakres na [0 - 255] w przeciwieństwie do [-128-127].

Zazwyczaj znaki niepodpisane są używane, gdy nie chcesz znaku. Będzie to miało znaczenie podczas przesuwania bitów (przesunięcie rozszerza znak) i innych rzeczy, gdy mamy do czynienia z znakiem jako bajtem, zamiast używać go jako liczby.

 0
Author: ,
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-09-16 18:20:27

[[2]} cytat z książki "the C programming laugage":

Kwalifikator signed LUB unsigned może być zastosowany do znaku lub dowolnej liczby całkowitej. numery niepodpisane są zawsze dodatnie lub zerowe i spełniają prawa arytmetyki modulo 2^n, gdzie n jest liczbą bitów w rodzaju. Tak więc, na przykład, jeśli znaki mają 8 bitów, zmienne unsigned char mają wartości od 0 do 255, podczas gdy znaki podpisane mają wartości od -128 do 127 (w dwójce / align = "left" / ) Czy znaki zwykłe są podpisane czy niepodpisane to zależne od maszyny, ale drukowalne znaki są zawsze pozytywne.

 0
Author: ZhaoGang,
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
2017-07-21 03:27:53

Unsigned char przyjmuje tylko wartości dodatnie: od 0 do 255 signed char przyjmuje wartości dodatnie i ujemne: -128 do +127

 0
Author: NL628,
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
2017-11-24 22:40:44