整數的數字型別 (C# 參考)
整數數值型別代表整數。 所有整數數字型別為實值型別。 其也是簡單型別,可以使用常值初始化。 所有整數的數字型別都支援算術、位元邏輯、比較和等號運算子。
整數型別的特性
C# 支援下列預先定義的整數型別:
C# 型別/關鍵字 | 範圍 | 大小 | .NET 類型 |
---|---|---|---|
sbyte |
-128 到 127 | 帶正負號的 8 位元整數 | System.SByte |
byte |
0 至 255 | 不帶正負號的 8 位元整數 | System.Byte |
short |
-32,768 至 32,767 | 帶正負號的 16 位元整數 | System.Int16 |
ushort |
0 到 65,535 | 不帶正負號的 16 位元整數 | System.UInt16 |
int |
-2,147,483,648 至 2,147,483,647 | 帶正負號的 32 位元整數 | System.Int32 |
uint |
0 到 4,294,967,295 | 不帶正負號的 32 位元整數 | System.UInt32 |
long |
-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 | 帶正負號的 64 位元整數 | System.Int64 |
ulong |
0 到 18,446,744,073,709,551,615 | 不帶正負號的 64 位元整數 | System.UInt64 |
nint |
取決於平台 (在執行階段計算) | 帶正負號的 32 位元或 64 位元整數 | System.IntPtr |
nuint |
取決於平台 (在執行階段計算) | 不帶正負號的 32 位元或 64 位元整數 | System.UIntPtr |
在所有資料表資料列中 (除了最後兩列),最左邊欄中的每個 C# 型別關鍵字,都是相對應 .NET 型別的別名。 關鍵字和 .NET 型別名稱是可交換的。 例如,下列宣告會宣告相同型別的變數:
int a = 123;
System.Int32 b = 123;
資料表最後兩個資料列中的 nint
和 nuint
型別是原生大小的整數。 您可以使用 nint
和 nuint
內容關鍵字來定義 原生大小的整數。 在 32 位元處理序中執行時,這些是 32 位元整數,或在 64 位元處理序中執行時為 64 位元整數。 可以將其應用於 Interop 情節、低階程式庫,以及在廣泛使用整數數學的情節中將效能最佳化。
原生大小的整數型別會在內部表示為 .NET 型別 System.IntPtr 和 System.UIntPtr。 從 C# 11 開始,nint
和 nuint
型別是基礎型別的別名。
每個整數型別的預設值都是零 (0
)。
每個整數型別都有 MinValue
與 MaxValue
屬性,提供該型別的最小與最大值。 這些屬性是編譯時間常數,但原生大小型別 (nint
和 nuint
) 的案例除外。 會在執行階段針對原生大小型別計算 MinValue
和 MaxValue
屬性。 這些型別的大小取決於處理序設定。
使用 System.Numerics.BigInteger 結構來表示帶正負號的整數,無上下限。
整數常值
整數常值可以是
- 十進位:不含任何前置詞
- 十六進位:含有
0x
或0X
前置詞 - 二進位:含
0b
或0B
前置詞
下列程式碼示範以下各項的範例:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
上述範例也會示範使用 _
作為數字分隔符號。 您可以使用數字分隔符號搭配所有類型的數值常值。
整數常值的型別取決於其尾碼,如下所示:
如果整數常值沒有尾碼,其型別會是下列型別中可表示其值的第一個型別:
int
、uint
、long
、ulong
。注意
常值會解譯為正值。 例如,常值
0xFF_FF_FF_FF
代表uint
型別的數目4294967295
,不過其位元標記法與int
型別的-1
數目相同。 如果您需要特定型別的值,請將常值轉換成該型別。 如果目標型別中不能表示常值,請使用unchecked
運算子。 範例:unchecked((int)0xFF_FF_FF_FF)
會產生-1
。如果常值的尾碼為
U
或u
,其型別會是下列型別中可表示其值的第一個型別:uint
、ulong
。如果常值的尾碼為
L
或l
,其型別會是下列型別中可表示其值的第一個型別:long
、ulong
。注意
您可以使用小寫字母
l
作為尾碼。 不過,這會產生編譯器警告,因為字母l
很容易與數字1
混淆。 為了清楚起見,請使用L
。如果常值尾碼為
UL
、Ul
、uL
、ul
、LU
、Lu
、lU
或lu
,其型別為ulong
。
如果整數常值所代表的值超出 UInt64.MaxValue,就會發生編譯錯誤 CS1021。
如果整數常值所決定的型別是 int
,而常值所代表的值是在目的型別的範圍內,則可以隱含地將值轉換成 sbyte
、byte
、short
、ushort
、uint
、ulong
、nint
或 nuint
:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
如上述範例所示,如果常值的值不在目的地型別的範圍內,就會發生編譯器錯誤 CS0031。
您也可以使用轉換,將整數常值所代表的值轉換為常值型別以外的型別:
var signedByte = (sbyte)42;
var longVariable = (long)42;
轉換
您可以將任何整數數值型別轉換成任何其他整數數值型別。 如果目的地型別可以儲存來源型別的所有值,則轉換是隱含的。 否則,您必須使用轉換運算式來執行明確轉換。 如需詳細資訊,請參閱內建數值轉換。
原生大小的整數
原生大小的整數型別有特殊行為,因為儲存體是由目標機器上的自然整數大小所決定。
若要在執行階段取得原生大小的整數大小,您可以使用
sizeof()
。 不過,必須在不安全的內容中編譯程式碼。 例如:Console.WriteLine($"size of nint = {sizeof(nint)}"); Console.WriteLine($"size of nuint = {sizeof(nuint)}"); // output when run in a 64-bit process //size of nint = 8 //size of nuint = 8 // output when run in a 32-bit process //size of nint = 4 //size of nuint = 4
您也可以從靜態 IntPtr.Size 和 UIntPtr.Size 屬性取得相等的值。
若要在執行階段取得原生大小整數的最小值和最大值,請使用
MinValue
和MaxValue
作為具有nint
和nuint
關鍵字的靜態屬性,如下列範例所示:Console.WriteLine($"nint.MinValue = {nint.MinValue}"); Console.WriteLine($"nint.MaxValue = {nint.MaxValue}"); Console.WriteLine($"nuint.MinValue = {nuint.MinValue}"); Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}"); // output when run in a 64-bit process //nint.MinValue = -9223372036854775808 //nint.MaxValue = 9223372036854775807 //nuint.MinValue = 0 //nuint.MaxValue = 18446744073709551615 // output when run in a 32-bit process //nint.MinValue = -2147483648 //nint.MaxValue = 2147483647 //nuint.MinValue = 0 //nuint.MaxValue = 4294967295
您可以在下列範圍內使用常數值:
- 針對
nint
:Int32.MinValue 至 Int32.MaxValue。 - 針對
nuint
:UInt32.MinValue 至 UInt32.MaxValue。
- 針對
編譯器提供對其他數值型別的隱含和明確轉換。 如需詳細資訊,請參閱內建數值轉換。
原生大小的整數常值沒有直接語法。 沒有尾碼表示常值是原生大小的整數,例如
L
表示long
。 您可以改用其他整數值的隱含或明確轉換。 例如:nint a = 42 nint a = (nint)42;
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: