Kurzusok
/
C#
C#
/
Tanterv
/
Egész számok
Eg

Egész számok ebben a kurzusban: C#

7 feladat

A(z) Egész számok fogalomról

A C# a sok statikusan típusos nyelvhez hasonlóan számos olyan típust kínál, amely egész számokat ábrázol, és mindegyiknek megvan a maga értéktartománya. A skála alsó végén az sbyte típus minimumértéke -128, maximumértéke pedig 127. Mint minden egésztípusnál, ezek az értékek <type>.MinValue és <type>.MaxValue formában érhetők el. A skála felső végén a long típus minimumértéke -9 223 372 036 854 775 808, maximumértéke 9 223 372 036 854 775 807. A kettő között helyezkedik el a short és az int típus.

A fenti típusok mindegyikének megvan a maga előjel nélküli megfelelője: sbyte/byte, short/ushort, int/uint és long/ulong. Az értéktartomány minden esetben 0-tól az előjeles maximum kétszerese plusz egy értékig terjed.

Az előjel nélküli egésztípusok értékeit egy egyszerű 2-es alapú ábrázolás írja le. Az előjeles típusok értékei a kettes komplemensű előjeles számábrázolást használják.

Az egésztípusok sokfélesége a gépi architektúrákat tükrözi: a regiszterek méretét, a CPU-utasítások argumentumainak méretét és az előjel kezelését a CPU-n belül. Egy long típusú érték 64 bitet használ, míg egy sbyte típusú érték 8 bitet. Bizonyos esetekben ennek kihatása lehet a CPU teljesítményére, a memóriahasználatra és akár a lemezhasználatra is (ahol általában előnyös egy kisebb egésztípus választása). Az egész type megválasztása emellett egy durva, de kézenfekvő módja lehet annak, hogy más fejlesztőkkel közöljük a várható értéktartományt. Az int típust széles körben alapértelmezett típusként használják, ha a konkrét felhasználásról nem derült ki semmi különös. A long vagy ulong típust gyakran egyszerű azonosítóként használják. A típus bájtban mért mérete határozza meg az értéktartományt.

A mostanáig tárgyalt típusok primitív típusok. Mindegyikhez tartozik egy struct alias, amely megvalósítja a típushoz kapcsolódó mezőket (például MinValue) és metódusokat (például ToString()).

Típus Struktúra Szélesség Minimum Maximum
sbyte SByte 8 bit -128 +127
short Int16 16 bit -32_768 +32_767
int Int32 32 bit -2_147_483_648 +2_147_483_647
long Int64 64 bit -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte Byte 8 bit 0 +255
ushort UInt16 16 bit 0 +65_535
uint UInt32 32 bit 0 +4_294_967_295
ulong UInt64 64 bit 0 +18_446_744_073_709_551_615

Kasztolás

Egy adott típusú változó (vagy kifejezés) könnyedén átalakítható egy másik típusúvá. Egy értékadás során például, ha a hozzárendelt érték típusa (rhs) garantálja, hogy az érték beleillik a fogadó típus (lhs) tartományába, akkor elég egy egyszerű értékadás:

ulong ul;
uint ui = uint.MaxValue;
ul = ui;    // no problem

Ha viszont a forrástípus tartománya nem részhalmaza a cél típus értéktartományának, akkor egy kasztolásra, azaz a () műveletre van szükség akkor is, ha az adott érték beleesik a cél típus tartományába:

uint ui;
short s = 42;
ui = (uint)s;

A fenti példában, ha az érték a cél típus tartományán kívül esne, akkor túlcsordulás következne be. Lásd: overflow.

A kasztolás szükségességét a két érintett típus dönti el, nem egy konkrét érték.

A következő bekezdések az egésztípusok kasztolását tárgyalják. (Lásd a casting oldalt, amely szélesebb körben tárgyalja a kasztolást és a típuskonverziót.) Az egésztípusok, valamint a lebegőpontos számok, a char és a bool közötti átalakításról az ottani dokumentációban olvashatsz.

Primitív típusok kasztolása - implicit

A C# típusrendszere némileg szigorúbb, mint a C vagy a JavaScript típusrendszere, ezért a kasztolási műveletek is megkötöttebbek. Az implicit kasztolás két numerikus típus között akkor megy végbe, ha a „cél” típus meg tudja őrizni a „forrás” típus értékének nagyságrendjét és előjelét.

Az implicit kasztolást semmilyen különleges szintaxis nem jelöli.

Primitív típusok kasztolása - explicit

Ahol a numerikus típusok nem kasztolhatók implicit módon, ott általában használhatod az explicit kasztolás operátorát.

Ha a kasztolt értéket a „cél” típus nem tudja ábrázolni, mert nem elég széles, vagy előjel-ütközés van, akkor túlcsordulási kivétel dobódhat.

Primitív típusok kasztolása - példák
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;

// implicit cast
int from_ushort = shortUnsignedInt;          // 65535
float from_int = largeInt;                   // -21474836E+09

// explicit cast
uint from_largeInt = (uint)largeInt;         // 2147483647
uint from_neg = (uint) largeNegInt;          // 2147483648 or OverflowException is thrown (if checked)

Bitek konvertálása

A BitConverter osztály kényelmes módot kínál arra, hogy az egésztípusokat bájtok tömbjévé és vissza alakítsd.

Hivatkozások
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Egész számok fogalmat

A gyakorlás zárolva

Oldj fel még 5 feladatot, hogy gyakorolhasd a(z) Egész számok fogalmat