Niepodpisane słowo kluczowe w C ++

87

Czy słowo kluczowe unsigned ma domyślnie określony typ danych w C ++? Próbuję napisać funkcję dla klasy dla prototypu:

unsigned Rotate(unsigned object, int count)

Ale tak naprawdę nie rozumiem, co unsignedto znaczy. Nie powinno tak być, unsigned intczy coś?

Kryształ
źródło

Odpowiedzi:

92

Z linku powyżej:

Kilka z tych typów można modyfikować za pomocą słów kluczowych „signed, unsigned, short i long”. Gdy jeden z tych modyfikatorów typu jest używany samodzielnie, zakłada się, że typ danych to int

Oznacza to, że możesz założyć, że autor używa ints.

futureelite7
źródło
Czy to C99 i MISRA mogą to zrobić?
nowox
42

Typy liczb całkowitych:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

Uważaj na char:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char
Martin York
źródło
1
@Firas: Wiem, że jest w C. Implicit int nie jest ani częścią ISO C99, ani częścią ISO C ++
Prasoon Saurav
4
Użycie „unsigned” (samego) do zadeklarowania typu „unsigned int” jest standardem w C ++. W obecnym standardzie: 7.1.5.2 [dcl.simple.type] zawiera tabelę, która identyfikuje każdą deklarację typu zgodnie z aktualnie używanym typem. Ta tabela ma odpowiednik od deklaracji „unsigned” do typu „unsigned int”.
David Rodríguez - dribeas
2
Zauważ, że char zachowuje się identycznie jak znak ze znakiem lub bez znaku, ale pozostaje oddzielnym typem bez względu na wszystko.
@Firas: Zobacz sekcję: 3.9.1 Podstawowe typy. Paragrah 2: <quote> Istnieje pięć standardowych typów liczb całkowitych ze znakiem: „signed char”, „short int”, „int”, „long int” i „long long int”. </quote>
Martin York
21

Czy słowo kluczowe unsigned domyślnie określa typ danych w C ++

Tak, podpisane i niepodpisane mogą być również używane jako samodzielne specyfikatory typu

Typy danych liczb całkowitych char, short, long i int mogą być ze znakiem lub bez znaku, w zależności od zakresu liczb, które mają być reprezentowane. Typy ze znakiem mogą reprezentować zarówno wartości dodatnie, jak i ujemne, podczas gdy typy bez znaku mogą reprezentować tylko wartości dodatnie (i zero).

Liczba całkowita bez znaku zawierająca n bitów może mieć wartość od 0 do 2 n - 1 (czyli 2 n różnych wartości).

Jednak signed i unsigned mogą być również używane jako samodzielne specyfikatory typu, co oznacza to samo, co odpowiednio signed int i unsigned int. Poniższe dwie deklaracje są równoważne:

unsigned NextYear;
unsigned int NextYear;
Prasoon Saurav
źródło
3
Czy to nie jest „tak”? Domyślnie jest to int, jeśli jest używane bez typu?
odpocząć
Dziękuję Ci! Angielski nie jest moim pierwszym językiem i byłem zaskoczony znaczeniem typu danych bez znaku. Czyj podpis zawiera? Nigdy nie przyszło mi do głowy, że może to pochodzić ze znaku rzeczownika ...: D
user74200
Słowa kluczowe shorti longsą również modyfikatorami typów . Jeśli piszesz short s, to faktycznie oznacza short int s, tak jak unsigned ufaktycznie oznacza unsigned int u. (i unsigned shortoznacza unsigned short int)
Ben Voigt
8

Możesz przeczytać o słowie kluczowym unsigned w C ++ Reference .

Istnieją dwa różne typy w tej sprawie, podpisane i nie podpisane. Wartość domyślna dla liczb całkowitych jest podpisana, co oznacza, że ​​mogą mieć wartości ujemne.

W systemie 32-bitowym liczba całkowita to 32 bity, co oznacza, że ​​może zawierać wartość ~ 4 miliardy.

A kiedy jest podpisany, oznacza to, że musisz go podzielić, pozostawiając -2 miliardy do +2 miliardy.

Gdy jest bez znaku, wartość nie może zawierać żadnych liczb ujemnych, więc dla liczb całkowitych oznaczałoby to od 0 do +4 miliardów.

Więcej informacji na ten temat można znaleźć w Wikipedii .

Filip Ekberg
źródło
2
Sam lubię śpiewać do większości rzeczy. Pyszny węgiel i karmelizacja!
Omnifarious
1
A może edytuj literówki? ... do tego służy przycisk „edytuj”!
Filip Ekberg
3

Tak, to znaczy unsigned int. Kiedyś było tak, że jeśli nie określałeś typu danych w C, było wiele miejsc, w których po prostu zakładano int. Było to na przykład próba zwracania typów funkcji.

Ta brodawka została w większości zlikwidowana, ale napotykasz tutaj jej ostatnie ślady. IMHO, kod powinien zostać naprawiony, unsigned intaby uniknąć tego rodzaju zamieszania, którego doświadczasz.

Wszelaki
źródło