Konversi Manual (Cast)

4.9 Konversi Manual (Cast)

Konversi manual atau cast dapat dilakukan walaupun ada beberapa konsekuensinya. Jika suatu floating point dikonversi menjadi integer, maka bagian fraksionalnya akan

hilang. Lalu jika nilai yang ingin dikonversi berada diluar batas type tujuan, maka informasi juga akan hilang. Cara melakukan cast adalah dengan menuliskan type tujuan di dalam kurung. Kita lihat contoh program berikut:

[program lengkap] / / Pr ogr am 4.11 - Cast

using Syst em ;

class Cast {

st at ic v oid Main( ) {

double x = 300.5; short y = (shor t ) x; by t e z = ( by t e) y ; Console. Wr it eLine( x ) ; Console. Wr it eLine( y ) ; Console. Wr it eLine( z) ;

} } [/program lengkap]

Inilah outputnya:

[console]

44 [/console]

Kita bisa melihat bahwa karena nilai x (300) berada di luar wilayah byte (0 sampai 255), maka hasil yang diperoleh pun kacau. Perlu diketahui semua konversi baik otomatis maupun melalui cast tidak akan mengubah nilai variabelnya sendiri. Buktinya nilai x saat ditulis ke layar tetap 300.5 dan nilai y tetap 300.

[tanya jawab] Q: OK, hasilnya kacau, tapi kenapa 300 menjadi 44?

A: Ini berhubungan dengan bit-bit yang dihilangkan. 300 (short) dalam binary adalah 0000 0001 0010 1100. Sementara short memakan 16 bit, byte hanya menggunakan 8 bit. Saat short dikonversi menjadi byte, 8 bit atasnya terpaksa dihilangkan sehingga 0000 0001 0010 10 menjadi 0000 0001 0010 10 yang nilai desimalnya 44. [/tanya jawab]

Dengan konversi manual kita bisa mengubah char menjadi bilangan dan sebaliknya. Perha stikan contoh berikut:

[program lengkap] / / Pr ogr am 4.11 - Cast m enj adi/ k e char

using Syst em ;

class Cast Ch ar {

st at ic v oid Main( ) {

Console. Wr it eLine( “ Kode Unicode 67 k ar ak t er ny a adalah: ” ) ; Console. Wr it eLine( ( char ) 67) ; Console. Wr it eLine( “ Kar ak t er ‘b’ k ode Unicodeny a adalah: ” ) ; Console. Wr it eLine( ( int ) ’b’) ;

} } [/program lengkap]

Ini adalah outputnya:

[console] Kode Unicode 67 k ar ak t er ny a adalah: C Kar ak t er ` b' k ode Unicodeny a adalah:

98 [/console]

Kita bisa lihat bahwa cast tidak hanya terbatas pada assignment saja. Ada kasus-kasus khusus yang perlu diketahui:

[kutipan] byt e x = 1; [/kutipan]

Walaupun 1 adalah literal yang typenya int dan byte lebih kecil dari int, kita tidak perlu melakukan cast. Compiler akan melakukan pengecekan untuk memastikan bahwa nilai yang ingin dimasukkan berada di dalam batas byte. Ini berlaku untuk assignment kepada ulong, uint, dan type lain yang lebih kecil dari int. Sekarang perhatikan contoh di bawah ini:

[kutipan program] int x = 1 by t e y = x ; / / har us m enggunak an: by t e y = ( int) x; [/kutipan program]

Program di atas tidak akan dapat dicompile karena x merupakan variabel int yang bisa berisi nilai di luar batas byte. Integer dapat dikonversi secara otomatis menjadi decimal namun tidak sebaliknya. float dan double tidak kompatibel dengan decimal dan memerlukan cast jika ingin melakukan konversi. char walaupun secara internal merupakan sebuah integer, dianggap spesial dan tidak kompatibel dengan type lainnya.

[catatan] Terdapat beberapa hal yang tidak konsisten dalam C#. Contohnya ...

[kutipan program] float f = 1.0; / / er r or ! har us m enggunak an cast at au m enulisk an 1.0f [/kutipan program]

... tidak diizinkan karena 1.0 typenya double, tetapi...

[kutipan program] byt e b = 1; / / boleh asal nilainy a ber ada di d alam bat as b y t e [/kutipan program]

... diizinkan padahal 1 typenya adalah int dan byte lebih kecil daripada int. Seharusnya ditentukan suatu aturan bahasa yang konsisten.

[/catatan]