Bagikan melalui


Konversi numerik bawaan (referensi C#)

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

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, , longfloat, double, atau decimal, atau , ataunint
int, , longuint, ulong, float, double, atau decimal, nint, atau , ataunuint
int long, , floatdouble, atau decimal,nint
uint long, , ulongfloat, double, atau decimal, atau , ataunuint
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, , uintlong, , ulong, nintatau nuint ke float dan dari long, ulong, nint, atau nuint dapat double menyebabkan hilangnya presisi, tetapi tidak pernah kehilangan urutan besarnya. 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 harfiah) 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'
    

    Seperti yang ditunjukkan contoh sebelumnya, 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, ushortshort, int, uint, long, ulong, float, , decimal, nint, ataunuint
desimal sbyte, , byte, ushortshort, 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 menjadi 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 double terdekatfloat.

Spesifikasi bahasa C#

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

Lihat juga