C# 和許多靜態型別的語言一樣,提供了多種代表整數的型別,每種都有自己的值域。位在最低端的是sbyte型別,最小值是 -128,最大值是 127。和所有整數型別一樣,這些值可以用<type>.MinValue和<type>.MaxValue取得。位在最高端的是long型別,最小值是 -9,223,372,036,854,775,808,最大值是 9,223,372,036,854,775,807。介於兩者之間的是short和int型別。
上述每個型別都有一個不帶號的對應型別:sbyte/byte、short/ushort、int/uint以及long/ulong。無論是哪一種,值域都是從 0 到帶號最大值的負值乘以 2 再加 1。
不帶號整數型別的值採用簡單的以 2 為基底表示法。帶號型別的值則使用二補數帶號數值表示法。
整數型別之所以有這麼多種,反映的是機器架構:暫存器的大小、CPU 指令引數的大小,以及 CPU 內部如何處理正負號。long型別的值使用 64 位元,而sbyte型別的值使用 8 位元。在某些情況下,這會影響 CPU 效能、記憶體用量,甚至磁碟用量(一般而言,選擇較小的整數型別比較有利)。選擇整數type也可以粗略地向其他開發者傳達預期的值域。如果某個用途沒有什麼特別之處,int型別是最廣泛使用的預設型別。long或ulong則常被當作簡單的識別碼使用。型別的大小(以位元組計)決定了值域。
到目前為止討論的型別都是_基本_型別。每個型別都有一個struct別名,實作了與該型別相關的欄位(例如MinValue)與方法(例如ToString())。
| 型別 | 結構 | 寬度 | 最小值 | 最大值 |
|---|---|---|---|---|
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 |
某個型別的變數(或運算式)可以輕鬆地轉換成另一個型別。例如在指定運算中,如果被指定的值(rhs)的型別能確保該值落在要指定過去的型別(lhs)的值域內,就可以直接指定:
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
另一方面,如果來源型別的值域不是目的地型別值域的子集,那麼即使某個特定的值落在目的地型別的值域內,仍然需要轉型,也就是()運算:
uint ui;
short s = 42;
ui = (uint)s;
在上面的例子中,如果該值其實落在目的地型別的值域之外,就會發生溢位。請參閱 overflow。
是否需要轉型,取決於涉及的兩個型別,而不是某個特定的值。
以下幾段討論整數型別的轉型。(請參閱 casting)那裡對轉型與型別轉換有更廣泛的討論。關於整數型別與浮點數、char和bool之間的轉換,請參閱該份文件。
C# 的型別系統比 C 或 JavaScript 的嚴格一些,因此轉型操作受到的限制也更多。只要「目的地」型別能保留「來源」型別值的尺度與正負號,兩個數值型別之間就會發生隱含轉型。
隱含轉型不需要任何特殊的語法。
當數值型別無法隱含轉型時,通常可以使用明確轉型的運算子。
如果被轉型的值因為目的地型別不夠寬,或發生正負號衝突,而無法用「目的地」型別表示,就可能會擲回溢位例外。
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)
BitConverter類別提供了方便的方式,在整數型別與位元組陣列之間互相轉換。