Bagikan melalui


Konversi numerik bawaan (referensi C#)

C# menyediakan satu set jenis numerik integral dan floating-point . Konversi implisit atau eksplisit ada di antara dua jenis numerik. Gunakan ekspresi cast untuk melakukan konversi eksplisit.

Referensi bahasa C# mendanai versi bahasa C# yang terbaru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.

Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.

Tip

Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.

Konversi numerik implisit

Tabel berikut menunjukkan konversi implisit yang telah ditentukan sebelumnya antara jenis numerik bawaan:

Dari Untuk
sbyte short, , intlong, float, double, decimal, , ataunint
byte short, , ushortint, uint, long, ulong, float, double, decimal, , nint, ataunuint
pendek int, long, float, double, decimal, atau nint
int, uint, long, ulong, float, double, decimal, nint, atau nuint
int long, float, double, decimal, atau nint
uint long, ulong, float, double, decimal, atau nuint
long float, double, atau decimal
ulong float, double, atau decimal
float double
nint long, float, double, atau decimal
nuint ulong, float, double, atau decimal

Nota

Konversi implisit dari int, , uint, long, ulongnint, atau nuint ke float dan dari long, ulong, nint, atau nuint untuk double dapat menyebabkan hilangnya presisi, tetapi tidak pernah kehilangan urutan besaran. Konversi numerik implisit lainnya belum pernah kehilangan informasi apa pun.

Perhatikan juga bahwa

  • Jenis numerik integral secara implisit dapat dikonversi ke jenis numerik floating-point apa pun.

  • Tidak ada konversi implisit ke byte jenis dan sbyte . Tidak ada konversi implisit dari double jenis dan decimal .

  • Tidak ada konversi implisit antara decimal jenis dan float jenis atau double .

  • Nilai ekspresi konstan jenis int (misalnya, nilai yang diwakili oleh bilangan bulat literal) dapat dikonversi secara implisit ke sbyte, , byte, ushortshort, uint, ulong, nint, atau nuint jika berada dalam rentang jenis tujuan:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

Jika nilai konstanta tidak berada dalam rentang jenis tujuan, kesalahan pengkompilasi CS0031 terjadi.

Konversi numerik eksplisit

Tabel berikut menunjukkan konversi eksplisit yang telah ditentukan sebelumnya antara jenis numerik bawaan yang tidak ada konversi implisit:

Dari Untuk
sbyte byte, ushort, uint, ulong, atau nuint
byte sbyte
pendek sbyte, byte, ushort, uint, ulong, atau nuint
sbyte, byte, atau short
int sbyte, , byteshort, ushort, uint, ulong, , ataunuint
uint sbyte, byte, short, ushort, int, atau nint
long sbyte, byte, short, ushort, int, uint, ulong, nint, atau nuint
ulong sbyte, byte, short, ushort, int, uint, long, nint, atau nuint
float sbyte, , byteshort, ushort, int, uint, long, ulong, decimal, , nint, ataunuint
ganda sbyte, , byte, shortushort, int, uint, long, ulong, float, , decimal, nint, ataunuint
desimal sbyte, , byte, shortushort, int, uint, long, ulong, float, , double, nint, ataunuint
nint sbyte, , byteshort, ushort, int, uint, ulong, , ataunuint
nuint sbyte, , byteshort, ushort, int, uint, long, , ataunint

Nota

Konversi numerik eksplisit dapat mengakibatkan kehilangan data atau melemparkan pengecualian, biasanya OverflowException.

Perhatikan juga bahwa:

  • Saat Anda mengonversi nilai jenis integral ke jenis integral lain, hasilnya tergantung pada konteks pemeriksaan luapan. Dalam konteks yang dicentang, konversi berhasil jika nilai sumber berada dalam rentang jenis tujuan. Jika tidak, maka akan menghasilkan kesalahan OverflowException. Dalam konteks yang tidak dicentang, konversi selalu berhasil, dan berlanjut sebagai berikut:

    • Jika jenis sumber lebih besar dari jenis tujuan, maka nilai sumber dipotong dengan membuang bit "ekstra" yang paling signifikan. Hasilnya kemudian diperlakukan sebagai nilai dari jenis tujuannya.
    • Jika jenis sumber lebih kecil dari jenis tujuan, maka nilai sumber tersebut diperpanjang tanda atau diperpanjang dengan nol agar berukuran sama dengan jenis tujuan. Ekstensi tanda tangan digunakan jika jenis sumber ditandatangani; zero-extension digunakan jika jenis sumber tidak ditandatangani. Hasilnya kemudian diperlakukan sebagai nilai dari jenis tujuannya.
    • Jika jenis sumber berukuran sama dengan jenis tujuan, maka nilai sumber diperlakukan sebagai nilai dari jenis tujuan.
  • Saat Anda mengonversi decimal nilai ke jenis integral, nilai ini dibulatkan ke nol ke nilai integral terdekat. Jika nilai integral yang dihasilkan berada di luar rentang jenis tujuan, nilai OverflowException akan dilemparkan.

  • Saat Anda mengonversi double nilai atau float menjadi jenis integral, nilai ini dibulatkan ke nol ke nilai integral terdekat. Jika nilai integral yang dihasilkan berada di luar rentang jenis tujuan, hasilnya tergantung pada konteks pemeriksaan luapan. Dalam konteks yang dicentang, dilemparkan OverflowException , sementara dalam konteks yang tidak dicentang, hasilnya adalah nilai yang tidak ditentukan dari jenis tujuan.

  • Saat Anda mengonversi double ke float, nilai dibulatkan double ke nilai terdekat float . double Jika nilainya terlalu kecil atau terlalu besar agar sesuai dengan jenisnyafloat, hasilnya adalah nol atau tak terbatas.

  • Saat Anda mengonversi float atau double menjadi decimal, nilai sumber dikonversi ke decimal representasi dan dibulatkan ke angka terdekat setelah tempat desimal ke-28 jika perlu. Bergantung pada nilai nilai sumber, salah satu hasil berikut dapat terjadi:

    • Jika nilai sumber terlalu kecil untuk direpresentasikan sebagai decimal, hasilnya menjadi nol.
    • Jika nilai sumber adalah NaN (bukan angka), tak terbatas, atau terlalu besar untuk direpresentasikan sebagai decimal, maka OverflowException akan dilemparkan.
  • Saat Anda mengonversi decimal ke float atau double, nilai sumber masing-masing dibulatkan ke nilai atau float terdekatdouble.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:

Lihat juga