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 |
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.
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.
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.
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)
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.