軌道
/
C#
C#
/
課程大綱
/
整數型別
整數

整數型別 在 C#

7 個練習

關於 整數型別

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類別提供了方便的方式,在整數型別與位元組陣列之間互相轉換。

參考資料
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 整數型別

練習已鎖定

再解鎖 5 個練習,就能練習 整數型別