Bagikan melalui


Konversi numerik bawaan (referensi C#)

C# menyediakan satu set jenis numerik integral dan floating-point. Terdapat konversi antara dua jenis numerik, baik implisit atau eksplisit. Anda harus menggunakan ekspresi transmisi untuk bisa melakukan konversi eksplisit.

Konversi numerik implisit

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

Dari Untuk
sbyte short, int, long, float, double, decimal, atau nint
byte short, ushort, int, uint, long, ulong, float, double, decimal, nint, atau nuint
pendek int, long, float, double, atau decimal, atau nint
ushort int, uint, long, ulong, float, double, atau decimal, nint, atau nuint
int long, float, double, atau decimal, nint
uint long, ulong, float, double, atau 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

Catatan

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

Juga perhatikan bahwa

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

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

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

  • Nilai ekspresi konstan jenis int (misalnya, nilai yang diwakili oleh literal bilangan bulat) dapat dikonversi secara implisit ke sbyte, byte, short, ushort, 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'
    

    Seperti yang ditunjukkan oleh contoh sebelumnya, jika nilai konstanta tidak berada dalam rentang jenis tujuan, kesalahan penyusun CS0031 terjadi.

Konversi numerik eksplisit

Tabel berikut ini 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
ushort sbyte, byte, atau short
int sbyte, byte, short, ushort, uint, ulong, atau nuint
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, byte, short, ushort, int, uint, long, ulong, decimal, nint, atau nuint
Double sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint, atau nuint
desimal sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint, atau nuint
nint sbyte, byte, short, ushort, int, uint, ulong, atau nuint
nuint sbyte, byte, short, ushort, int, uint, long, atau nint

Catatan

Konversi numerik eksplisit bisa 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 tercentang, konversi berhasil jika nilai sumber berada dalam rentang jenis tujuan. Jika tidak, OverflowException akan muncul. Dalam konteks yang tidak tercentang, konversi selalu berhasil, dan berlanjut sebagai berikut:

    • Jika jenis sumber lebih besar dari jenis tujuan, maka nilai sumber dipotong dengan membuang bit berlebih yang paling signifikan. Hasilnya kemudian diperlakukan sebagai nilai dari jenis tujuannya.

    • Jika jenis sumber lebih kecil dari jenis tujuan, maka nilai sumber akan diperpanjang atau diperpanjang nol sehingga berukuran sama dengan jenis tujuan. Ekstensi tanda tangan digunakan jika jenis sumber ditandatangani; ekstensi nol digunakan jika jenis sumber tidak harus ditandatangani. Hasilnya kemudian diperlakukan sebagai nilai dari jenis tujuannya.

    • Jika jenis sumber berukuran sama dengan jenis tujuan, maka nilai sumber akan diperlakukan sebagai nilai dari jenis tujuan.

  • Saat Anda mengonversi nilai decimal menjadi jenis integral, nilai ini dibulatkan ke nol ke nilai integral terdekat. Jika nilai integral yang dihasilkan berada di luar rentang jenis tujuan maka OverflowException akan dilemparkan.

  • Saat Anda mengonversi nilai double atau float ke tipe integral, nilai ini dibulatkan menuju nol ke nilai integral terdekat. Jika nilai integral yang dihasilkan berada di luar rentang jenis tujuan, hasilnya tergantung pada konteks pemeriksaan luapan. Di dalam konteks yang dicentang, OverflowException dilemparkan, 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 pas float dengan jenisnya, 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. Tergantung pada nilai sumber, salah satu hasil berikut dapat terjadi:

    • Jika nilai sumber terlalu kecil untuk direpresentasikan sebagai decimal, hasilnya akan menjadi nol.

    • Jika nilai sumber adalah NaN (bukan sebuah angka), tak terbatas, atau terlalu besar untuk direpresentasikan sebagai decimal, akan OverflowException dilemparkan.

  • Saat Anda mengonversi decimal ke float atau double, nilai sumber masing-masing dibulatkan ke nilai float atau double terdekat.

Spesifikasi bahasa C#

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

Lihat juga