整數數值類型代表整數。 所有整數數值類型都是 實值型別。 積分型態是 簡單型態 ,可以用 文字初始化。 所有整數數值類型都支持 算術、 位邏輯、 比較和 等號 運算元。
整數型別的特性
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。
nint和 nuint 類型是底層類型別名。
每個整數型別的預設值為零, 0。
每個整數型別都有 MinValue 和 MaxValue 屬性,可提供該型別的最小值和最大值。 這些屬性是編譯時間常數,但原生大小類型 (nint 和 nuint) 的情況除外。 在執行期間會計算 MinValue 和 MaxValue 屬性的原生大小型別。 這些類型的大小取決於進程設定。
System.Numerics.BigInteger使用 結構來表示沒有上限或下限的帶正負號整數。
整數常值
整數常值可以是
- decimal:不含任何前置詞
-
十六進位:具有
0x或0X前置詞 -
binary:具有
0b或0B前綴
下列程式代碼示範每個範例:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
上述範例也會示範 使用 _ 做為 數位分隔符。 您可以使用數字分隔符搭配各種數字字面值。
後綴決定整數字值的類型如下:
如果常值沒有後置詞,則其類型是下列第一個類型,其值可以表示:
int、、uint、longulong。備註
常值會解譯為正值。 例如,常值
0xFF_FF_FF_FF代表型別4294967295的數目uint,不過其位表示法與型別-1的數目int相同。 如果您需要特定類型的值,請將值型態轉換成該類型。 如果目標型別無法表示某個字面值,就使用 運算unchecked子。 範例:unchecked((int)0xFF_FF_FF_FF)會產生-1。若文字包含
U或 後u綴,其型態為以下可表示值的類型中的第一種:uint,ulong。若文字包含
L或 後l綴,其型態為以下可表示值的類型中的第一種:long,ulong。備註
您可以使用小寫字母
l作為後綴。 然而,會l產生編譯器警告,因為字母l可能與數字1混淆。 為了清楚起見,請使用L。若字面包含
UL,Ul,LuuLLUlUul或lu後綴之一,則其型別為 。ulong
如果整數常值所表示的值超過 UInt64.MaxValue,則會發生編譯程序錯誤 CS1021 。
若整數文字的確定型別為 ,int且該值在目標值範圍內,則可隱含轉換為 sbyte、 byte、 uintushortulongshortnint, 或: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雖然 和
nuint的完整範圍nint可以更大,但編譯時常數限制在 32 位元範圍內:- 針對
nint: Int32.MinValue 至 Int32.MaxValue。 - 針對
nuint: UInt32.MinValue 至 UInt32.MaxValue。
- 針對
編譯程式提供對其他數值類型的隱含和明確轉換。 如需詳細資訊,請參閱 內建數值轉換。
原生大小的整數常量沒有直接的語法。 沒有後綴表示常值是原生大小的整數,例如
L表示long。 您可以改用其他整數值的隱含或明確轉換。 例如:nint a = 42 nint a = (nint)42;
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: