Jaka jest różnica między „int” a „uint” / „long” i „ulong”?


Odpowiedzi:


224

Pierwotne typy danych z prefiksem „u” to wersje bez znaku o tych samych rozmiarach bitowych. W rzeczywistości oznacza to, że nie mogą przechowywać liczb ujemnych, ale z drugiej strony mogą przechowywać liczby dodatnie dwa razy większe niż ich podpisane odpowiedniki. Podpisane odpowiedniki nie mają przedrostka „u”.

Limity dla int (32 bity) są następujące:

int: 2147483648 to 2147483647 
uint: 0 to 4294967295 

I przez długi czas (64 bity):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615

12
Całkiem fajnie jest wykonać to ręcznie. 32-bitowa zmienna ze znakiem używa 1 bitu na znak (dodatni lub ujemny), więc może przechowywać wartości od -2 ^ 31 do + 2 ^ 31 - 1
Jaco Pretorius

porównując int i uint pod kątem użycia, który z nich jest wykonalny?
Arun Prasad

Jaki jest odpowiednik C ++?
darkgaze

1
@JacoPretorius To źle. 8 bitów int ma zakres od –128 do 127. Dziewiąty bit reprezentuje 256. Zatem przy 8 bitach można przedstawić wszystkie wartości do 255 (9-ta wartość - 1). Zakres od -128 do 127 ma długość dokładnie 255. Więc nie ma bitu, który przechowuje ten znak. Wszystkie wartości do 127 są dodatnie. Powyższe wartości są ujemne. 255 byłoby -1. 254 będzie
równe

Myślę, że warto również zauważyć, że szczególnie dla int vs uint liczba całkowita bez znaku nie jest zgodna z CLS i zaleca się używanie int tak często, jak to możliwe.
db2

38

uinti ulongsą niepodpisanymi wersjami inti long. To znaczy, że nie mogą być negatywne. Zamiast tego mają większą wartość maksymalną.

Typ Min Max Zgodny z CLS
int -2 147 483 648 2 147 483 647 Tak
uint 0 4 294 967 295 Nr
długie –9 223 372 036 854 775 808 9 223 372 036 854 775 807 Tak
ulong 0 18 446 744 073 709 551 615 Nr

Aby napisać literał unsigned int w kodzie źródłowym, możesz użyć sufiksu ulub Una przykład 123U.

Nie powinieneś używać uint i ulong w swoim interfejsie publicznym, jeśli chcesz być zgodny z CLS .

Przeczytaj dokumentację, aby uzyskać więcej informacji:

Nawiasem mówiąc, jest też short i ushort oraz byte i sbyte .


To ciekawe - co masz na myśli mówiąc o zgodności z CLS? Link prowadzi do dokumentacji MSDN dla int. Jeśli przez „CLS” masz na myśli specyfikację języka C #, to nie rozumiem - specyfikacja jasno opisuje zarówno uint, jak i ulong (sekcja 1.3)
Isak Savo

1
@Isak Savo: Ważne jest, aby być zgodnym z CLS, jeśli piszesz interfejs, który może być używany w innych językach .NET niż C #.
Mark Byers

Ciekawe, że wspomniałeś krótkie i krótkie, ale pomijasz bajt i sbyte :)
Roman Starkov

10

uoznacza unsigned, więc ulongjest duża liczba bez znaku. Możesz przechowywać większą wartość ulongniż long, ale niedozwolone są liczby ujemne.

longWartość jest przechowywana w wersji 64-bitowej, z pierwszą cyfrą, aby zobaczyć, czy jest to liczba dodatnia / ujemna. podczas gdy ulongjest również 64-bitowy, ze wszystkimi 64-bitowymi do przechowywania liczby. więc maksimum ulong to 2 (64) -1, a long to 2 (63) -1.


9

Różnica polega na tym, że uinti ulongsą typami danych bez znaku, co oznacza, że ​​zakres jest inny: nie akceptują wartości ujemnych:

int range: -2,147,483,648 to 2,147,483,647
uint range: 0 to 4,294,967,295

long range: 9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong range: 0 to 18,446,744,073,709,551,615

0

Minęło trochę czasu, odkąd ja C ++, ale te odpowiedzi są trochę błędne.

Jeśli chodzi o rozmiar, „int” nie jest niczym. Jest to hipotetyczna wartość standardowej liczby całkowitej; zakłada się, że jest szybki do celów takich jak iteracja. Nie ma ustalonego rozmiaru.

Tak więc odpowiedzi są poprawne w odniesieniu do różnic między int i uint, ale są niepoprawne, gdy mówią o „jak duże są” lub jaki jest ich zakres. Ten rozmiar jest niezdefiniowany, a dokładniej, zmieni się wraz z kompilatorem i platformą.

Publiczne omawianie rozmiaru swoich kawałków nigdy nie jest uprzejme.

Podczas kompilacji programu, int ma mieć rozmiar, jak wziąłeś abstrakcyjny C / C ++ i przekształcił go w betonowej kodu maszynowego.

W szczególności: jeśli piszesz program 32-bitowy, int będzie jedną rzeczą, 64-bitową, może być inna, a 16-bitową jest inna. Przeszedłem przez wszystkie trzy i przez chwilę patrzyłem na dreszcz 6502

Krótkie wyszukiwanie w Google pokazuje to: https://www.tutorialspoint.com/cprogramming/c_data_types.htm To także dobra informacja: https://docs.oracle.com/cd/E19620-01/805-3024/lp64- 1 / index.html

użyj int, jeśli naprawdę nie obchodzi cię, jak duże są twoje bity; może się zmienić.

Użyj size_t i ssize_t, jeśli chcesz wiedzieć, jak duże jest coś.

Jeśli czytasz lub zapisujesz dane binarne, nie używaj int. Użyj (zwykle zależnego od platformy / źródła) słowa kluczowego. WinSDK ma wiele dobrych, możliwych do utrzymania przykładów tego. Inne platformy też.

Spędziłem DUŻO czasu przeglądając kod od ludzi, którzy "SMH" myśląc, że to wszystko jest tylko akademickie / pedantyczne. Ci zjadali ludzi, którzy piszą kod nie do utrzymania. Jasne, jest łatwy w użyciu, wpisz „int” i używaj go bez dodatkowego wpisywania. To dużo pracy, aby dowiedzieć się, co naprawdę mieli na myśli, i trochę odrętwiające.

To kiepskie kodowanie, kiedy mieszasz int.

użyj int i uint, gdy chcesz po prostu szybką liczbę całkowitą i nie przejmujesz się zakresem (innym niż ze znakiem / bez znaku).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.