• About
  • Contact
  • Sitemap
  • Privacy Policy

C++ No.15: Mengenal Type Conversion dan Casting pada C++


Pernahkah anda mendengar type conversion?? Pernahkah anda mendengar casting?? Untuk anda yang berkecipung di dunia pemrograman C++ pasti sering mendengar dan melakukan konversi – konversi seperti ini. Dan untuk yang berkecipung di bahasa lain, sebetulnya anda setiap membuat program juga pasti melakukan istilah ini. :)

Apa itu type conversion?? Type conversion adalah konversi antar type, bisa dari int ke double, atau double ke int, atau type – type yang lain.

Apa itu casting?? Casting lebih dari konversi type, tapi juga konversi expression. Bingung? Kita akan bahas pada tutorial ini.



Sudahkah anda hafal dengan type – type data berikut ini:
Long double
Double
Float
Unsigned long int
Long int
Unsigned int
Int
Dan lain lain
?? Hayo, coba di cari di internet bila lupa,, :P

Ah, kita langsung saja ke pokok bahasan, kita bagi saja menjadi Type

A.TYPE CONVERSION
Type conversion adalah conversi antar type. Coba perhatikan contoh berikut ini.

Saya punya sebuah data ber-type double,
double dValue = 3.14156;

saya juga punya sebuah data ber-type int,
int iValue = 3;

nah, sampai disini sudah tahu kan contoh data ber-type double dan int??? kalo belum jelas tentang type data, coba cari – cari di google dulu,, ayo,, :)

nah, bagaimana kalo saya balik,, seperti contoh berikut:

double dValue = 3;
int iValue = 3.14156;


anda bisa lihat, saya mengisi type data double dengan type data int (3), kemudian saya mengisi type data int dengan double (3.14156). Apakah yang akan terjadi??

Yup, semua baik baik saja :P, karena compiler sudah tahu apa yang harus dilakukan. Ya, compiler akan otomatis meng-konversi data int ke double dan data double ke int.

Inilah yang dinamakan dengan ‘implisit conversion’.

Dengan kode di atas, maka nilai ‘3’ dari variable ‘dValue’ akan menjadi double ‘3.0 ‘, sedangkan nilai 3.14 bla bla bla akan diubah menjadi int ‘3’. Bisa di pahami bukan??

Lihat gambar 1:


Nah, mari sekarang kita main – main dengan tambah- tambahan mateka – mateka,,

Coba perhatikan expression berikut:
Cout << 3 + 3.14156 << endl;

Perhatikan, kita menjumlahkan type data int (3) dengan type data double (3.14156), hayo tebak, hasilnya apa?? :P
Yup hasilnya adalah double 6.14156, INT + DOUBLE = DOUBLE, berarti compiler melakukan implicit conversion ke double.

Mari kita coba lagi,
cout << 3u + 3.14156 << endl;
Hasilnya 6.14156, UNSIGNED INT + DOUBLE = DOUBLE, berarti compiler melakukan implicit conversion ke double.

Saya akan coba lagi,
cout << 3u + 3 << endl;
Hasilnya adalah 6, UNSIGNED INT + INT = INT, berarti compiler melakukan implicit conversion ke int.

Sekarang mari coba lagi,
cout << 4.f + 3 << endl;
Hasilnya adalah 7, FLOAT + INT = INT, berarti compiler melakukan implicit conversion otomatis ke int.

Yup, perhatikan kembali type data yang saya tulis di atas. Itu adalah hirarki dalam type data, dimana long double adalah hirarki tertinggi, sedangkan int adalah hirarki terendah. Dalam C++, konversi akan menuju ke level hirarki di atas nya. :) jadi int akan menjadi double saat dijumplahkan dengan double, bukan tetap int.

Berikut adalah hirarki dalam type data.
Long double
Double
Float
Unsigned long int
Long int
Unsigned int
Int


Pasti ada pertanyaan, dimanakah type data yang lain seperti char dan short?? Nah, char dan short akan di jadikan int atau Unsigned Int dalam konversi . mudah dipahami kan?

Tapi apakah selalu seperti pada hirarki data tadi?? Tidak, bahkan banyak problem seperti berikut ini:
cout << 5u - 10 << endl;

‘5u’ adalah 5 tetapi bertype data Unsigned Integer. Coba tebak apakah hasilnya??

Bila anda menggunakan CodeBlock IDE dengan GCC atau Visual Studio 2013 update 1 (seperti punya saya) , maka anda akan mendapatkan nilai 4294967291. Loh ko begini??
Lihat gambar 2:


Nah, kembali ke penjumlahan diatas, saya akan mencoba lagi seperti ini misalnya:

Int a = 2;
Int b = 3;
float hi = a*b;
cout << hi << endl;


seperti pada gambar berikut:
Lihat gambar 3:


Ternyata, compiler mengalikan INT * INT.

Nah, dari sekian banyak contoh tadi, secara implicit compiler kita akan mengkonver secara otomatis sesuai dengan ‘peraturannya dia(compiler)’ sendiri. Nah, bagaimana bila saya ingin memberikan pengaturan lain supaya compiler tidak seenaknya sendiri ke int mulu??

Mudah, caranya adalah dengan explicit conversion , yang disebut dengan CASTING.

B.CASTING
Casting merupakan explicit conversion. Dalam pemrograman C, kita bisa melakukan casting hanya dengan operator () dimana type data diletakkan di dalamnya.

Int a = 2;
Int b = 3;
float hi = (float)a*b;
cout << hi << endl;


nah, anda bisa lihat, kita menambahkan (float) sebagai operator untuk casting int ke float. Ini adalah standar pemrograman C.
Sesuai dengan hirarki data di atas, bila a sudah menjadi float, maka data b nantinya mengikuti float :) , akhirnya, pembagian berada dalam proses float, bukan integer.

Selain itu, kita juga bisa menggunakan style casting pemrograman C yang lain seperti berikut ini:

Int a = 2;
Int b = 3;
float hi = float(a)*b;
cout << hi << endl;


keren bukan? Mudah bukan? Eit, jangan salah, penggunaan seperti ini dalam kode ini memang berjalan sempurna, tetapi penggunakan style bahasa C ini pun bermata dua, bisa menjadi bumerang bagi kita, karena style C ini bisa melakukan error diluar perkiraan.
Sehingga, C++ membuat type casting yang jauh lebih bagus ketimbang penggunaan C style ini.

Berikut merupakan type casting tersebut.
static_cast
reinterpret_cast
const_cast
dynamic_cast



STATIC_CAST
Untuk anda yang sering melakukan konversi type data, pasti sering mendapati ‘warning’ pada compilernya, seperti konversi berikut ini:

int nValue = 48;
char ch = nValue; // implicit cast


Nah, type integer (int) merupakan type data 4 bytes, sedangkan char adalah type data 1 bytes. Bila kita konversi dari int ke char tentu ada data yang lost (hilang) sehingga compiler akan memberikan warning bahwa konversi ‘unsafe’.
Penggunaan static_cast memiliki manfaat yang banyak dalam konversi unsafe ini. Bila anda ingin tetap konversi tanpa warning, anda bila melakukan seperti berikut ini:

int nValue = 48;
char ch = static_cast(nValue);


lihat, type data berada di ‘< >’.

Static_cast bisa digunakan pada banyak tipe konversi seperti:
-Standard konversi , seperti int ke short, short ke float, dan lain – lain
-Class conversion
-Juga konversi dari ‘Derived Class ke Base Class’

REINTERPRET_CAST
Reinterpret_cast digunakan untuk konversi antar type yang tidak ‘safe’ seperti:
-Konversi integers ke pointer
-Konversi pointer ke pointer
-Konversi antar function-pointer

Masih ingat tentang pointer kah?? Kalo tidak salah sih ‘pointer’ dalam C++ ini terkadang menyulitkan bagi programmer, sehingga di bahasa lain (Visual C#), pointer ini sudah dihilangkan.

Coba diingat ingat, *p ini bacanya apa?? Bacanya ‘value pointed by p’,
&p ini bacanya ‘address of p’.

Lihat gambar 4:


andy = 25, bacanya, value dari andi adalah 25.
ted = &andy, bacanya, value dari ted adalah ‘address of andy’, sehingga akan menghasilkan 1776. Ini adalah memory address dari andy.

fred = *ted, bacanya, nilai dari fred adalah ‘valued pointed by ted’, padahal ted adalah ‘1776’, sehingga ‘value pointed by ted’ adalah 25.

Mari kembali ke reinterpret_cast.

Berikut merupakan contoh reinterpret_cast:
char *ptr_my = reinterpret_cast(0xb0000);


kode di atas, kita mengkonversi dari integer ke char pointer.

CONST_CAST
Const_cast digunakan untuk mengkonversi / meng-cast ‘const properties’ dari object.
Taukah anda apa itu ‘const’? silahkan baca artikel berikut bila anda lupa apa itu const...
http://duramecho.com/ComputerInformation/WhyHowCppConst.html

ya, dalam bahasa indonesia adalah konstant, yang artinya tetap, nilai dari variable ini tidak bisa diubah ubah, lalu bagaimana casting/konversinya?

int a;

const char *ptr_my = "Hello";

a = const_cast(ptr_my);

a = reinterpret_cast(ptr_my);

a = reinterpret_cast(const_cast(ptr_my) );


Pada kode di atas, kita membuat sebuah integer a, lalu membuat sebuah char pointer yang bertype const (tetap).

Pada a pertama, kita mencoba mengkonver dari char pointer ke integer pointer. Hasilnya akan error, karena const_cast tidak bisa mengkonver dari char pointer ke int pointer.

Pada a kedua, kita menggunakan reinterpret_cast tidak bisa mengkonvert const. Nah, yang paling bisa dijadikan trik adalah a ketiga.


DYNAMIC_CAST

Nah, kalo yang ini digunakan untuk konversi/casting pointer dan references. Dynamic_cast ini sering digunakan untuk konversi class ke base class.

Contoh:

class Base_Class { };
class Derived_Class: public Base_Class { };

Base_Class a;
Base_Class * ptr_a;
Derived_Class b;
Derived_Class * ptr_b;

ptr_a = dynamic_cast(&b);
ptr_b = dynamic_cast(&a);


konversi pertama akan berhasil karena kita mengkonver dari derived class ke base class.

Konversi kedua akan error, karena kita mengkonver dari base ke derived class.

Konversi dari base class ke derived class dalam C++ tidak diizinkan kecuali bila keduanya adalah polymorphic.

Nah, ternyata banyak kan type conversi dan casting ini. Perlu diketahui bahwa semua yang tertulis ini adalah masih simple. Untuk tingkat advance, silahkan anda bisa mengeceknya di google.

Sampai jumpa kembali pada tutorial berikutnya.
Salam.

J-Theme