Co to jest znak unsigned?
W C/C++, do czego służy unsigned char
? Czym się różni od zwykłego char
?
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
.
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.
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: {]}
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łkowitejJeś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)
-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?
- wszystkie bity biorą udział w określaniu jego wartości - to znaczy, że w obiekcie nie występują bity dopełniające.
- dodanie tylko jednego czasu
UCHAR_MAX+1
do-1
Da wartość w zakresie, czyliUCHAR_MAX
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.
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.
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
.
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.
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.
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
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ą.
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.
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ą.
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.
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 są 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.
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).
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.
[[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.
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
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