rksoftware

Visual Studio とか C# とかが好きです

C# 9.0 の確認「ネイティブ サイズの整数」

C# 9.0 の確認の目次はこちら

■ ネイティブ サイズの整数

ドキュメントはこちら

パフォーマンスと相互運用 という項目の二つ目のブロック (3行目の「ネイティブサイズの整数~」)です。
ninnuint という型が追加されました。雑にいうと 32 ビット環境では 32 ビット整数型に 64 ビット環境では 64 ビット整数型になるとのことです。

整数型についてのドキュメントはこちら

32 ビットでは int と同じ、64 ビットでは long と同じサイズ。

■ 検証コード

次のようなコードを動かしてみました。

Console.WriteLine($"int   : Type = {typeof(int).FullName, 14} : MinValue = {int.MinValue, 20} : MaxValue : {intMaxValue, 20}");
Console.WriteLine($"nint  : Type = {typeof(nint).FullName,14} : MinValue = {nint.MinValue,20} : MaxValue : {nintMaxValue,20}");
Console.WriteLine($"long  : Type = {typeof(long).FullName,14} : MinValue = {long.MinValue,20} : MaxValue : {longMaxValue,20}");
Console.WriteLine($"uint  : Type = {typeof(uint).FullName,14} : MinValue = {uint.MinValue, 20} : MaxValue : {uintMaxValue, 20}");
Console.WriteLine($"nuint : Type = {typeof(nuint).FullName,14} : MinValue = {nuint.MinValue, 20} : MaxValue : {nuintMaxValue, 20}");
Console.WriteLine($"ulong : Type = {typeof(ulong).FullName,14} : MinValue = {ulong.MinValue,20} : MaxValue : {ulongMaxValue,20}");

■ 結果

64 ビット (x64)

int   : Type =   System.Int32 : MinValue =          -2147483648 : MaxValue :           2147483647
nint  : Type =  System.IntPtr : MinValue = -9223372036854775808 : MaxValue :  9223372036854775807
long  : Type =   System.Int64 : MinValue = -9223372036854775808 : MaxValue :  9223372036854775807
uint  : Type =  System.UInt32 : MinValue =                    0 : MaxValue :           4294967295
nuint : Type = System.UIntPtr : MinValue =                    0 : MaxValue : 18446744073709551615
ulong : Type =  System.UInt64 : MinValue =                    0 : MaxValue : 18446744073709551615

32 ビット (x86)

int   : Type =   System.Int32 : MinValue =          -2147483648 : MaxValue :           2147483647
nint  : Type =  System.IntPtr : MinValue =          -2147483648 : MaxValue :           2147483647
long  : Type =   System.Int64 : MinValue = -9223372036854775808 : MaxValue :  9223372036854775807
uint  : Type =  System.UInt32 : MinValue =                    0 : MaxValue :           4294967295
nuint : Type = System.UIntPtr : MinValue =                    0 : MaxValue :           4294967295
ulong : Type =  System.UInt64 : MinValue =                    0 : MaxValue : 18446744073709551615```

実態としては System.IntPtr で、サイズはそれぞれ longint と同じになりました。

■ まとめ

この機能は誰もが使う機能というわけではないかもしれません。
しかし、こういった機能が強化されるということはそういったことにも当たり前に C# が使われるようになっているという証拠だと思います。今はなくとも、いずれそういった機能を使う日が来るでしょう。備えましょう。