Minggu ke-3 Tipe Data Dalam C Pendahuluan Setiap bahasa pemograman menyediakan tipe data. C memiliki beberapa tipe data primitif (intrinsic data type) yang merupakan bagian dari bahasa C itu sendiri. C juga memiliki tipe data lain yang biasa dikenal dengan istilah aggregate data type seperti array. Komplek data tipe dapat dibuat dengan kombinasi antara kedua tipe data tersebut. Minggu ini kita akan membahas bagaimana deklarasi, ekspresi serta cara memanipulasi tipe data dalam C. Objektif Memperkenalkan tipe data dan operator dalam C Menjelaskan beberapa contoh yang dapat menjebak programmer berkaitan dengan tipe data sehingga menimbulkan error Menjelaskan cara mengkonversi satu tipe data ke tipe data yang lain Bahan Bacaan Buku pegangan atau buku-buku lain yang menjelaskan tentang topik ini. Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 1
Tipe Data Primitif char signed char unsigned char signed short int signed int signed long int unsigned short int unsigned int unsigned long int float double long double Pada dasarnya keyword signed sangat jarang digunakan karena signed int sama artinya dengan int. Compiler mengerti bila suatu variable dideklarasikan bertipe int maka variable tersebut adalah signed int atau bilangan integer positif maupun negatif. Unsigned int berarti bilangan yang dimaksud adalah bilangan integer positif saja. Besar Memori Untuk tipe komputer 16 bits, tipe data short dan int membutuhkan memori sebesar 2 byte dan long 4 byte. Sedangkan untuk komputer 32 bits, tipe data short membutuhkan memori sebesar 2 byte dan int dan long sebesar 4 byte. Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 2
Signed int Komputer 16 bits 15 15 2 int + 2 1 = 32768 int + 32767 Komputer 32 bits 31 31 2 int + 2 1 = 2147483648 int + 2147483647 Unsigned int Komputer 16 bits 16 0 int + 2 1 = 0 int + 65535 Komputer 32 bits 32 0 int + 2 1 = 0 int + 4294967295 Gunakan sizeof untuk mengetahui besar memori yang dibutuhkan suatu variabel: printf("size of int = %d, size of double = %d\n", sizeof(int), sizeof(double)); Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 3
Operator Dalam C (Precedence & Associativity) Operator Associativity () []. -> ++(postfix) --(postfix) Kiri ke kanan ++(prefix) --(prefix)! ~ sizeof (type casting) + (unary) - (unary) &(address) * (dereference) Kanan ke kiri * / % Kiri ke kanan + - Kiri ke kanan << >> Kiri ke kanan < <= > >= Kiri ke kanan ==!= Kiri ke kanan & Kiri ke kanan ^ Kiri ke kanan Kiri ke kanan && Kiri ke kanan Kiri ke kanan?: Kanan ke kiri = += -= *= /= %= >>= <<= &= ^= = Kanan ke kiri, (comma operator) Kiri ke kanan Precedence High Low Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 4
Arithmetic Operator * Perkalian y * 10 / Pembagian a / b Apabila variabel a dan b bilangan bulat (integer) maka hasil pembagian akan dibulatkan (integer division) + Penjumlahan a + b - Pengurangan a - b % Modulus x % y Hanya bisa digunakan untuk tipe data integer termasuk char. Tidak dapat digunakan untuk bilangan pecahan seperti float dan double. 'c' % 10 Legal 5.5 % 2 Illegal x % y equivalen dengan x - y * ( x / y) - + Unary plus & minus Relational Operator > >= < <= a > b!= == a!= b a tidak sama dengan b a == b a sama dengan b &&! (a && b) (c &&!d)!x = 0 jika x adalah bilang bukan nol!x = 1 jika x adalah 0 Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 5
Increment/Decrement Operator Contoh ++ Increment x++ (postfic increment) ++x (prefix increment) -- Decrement x-- (postfix decrement) --x (prefix decrement) Tipe Data Dalam C x = 5; y = x++; Result: y = 5 dan x = 6 x = 5; y = ++x; Result: y = 6 dan x = 6 x = 5; y = x + x++; Berapakah nilai y? Nilai y tergantung dari evaluation order / system-dependant Bila evaluation order dari kiri ke kanan maka y = 10 Bila evaluation order dari kanan ke kiri maka y = 11 Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 6
Assignment Operator Penggunaan assignment operator = sering menjebak programmer. Operator = sangat jauh berbeda artinya dengan operator == Contoh if (x = y - 10)... Boolean expression of if statement Statement ini adalah legal dalam C. Ingat bahwa C tidak memiliki tipe data boolean. Non-zero selalu berarti TRUE dan zero berarti FALSE Assigment operator Statement di atas tidak sama dengan statement berikut ini: if (x == y - 10)... Logical operator Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 7
Assignment Operator Penggunaan assignment variable (operator) = expression sama artinya dengan variable = variable (operator) expression Contoh y += x; y = y + x; y /= (x + 2); y = y / (x + 2); y += (x %= 3) - (t *= 5); y = y + (x = x % 3) - (t = t * 5); y += (x == 2) Berapakah nilai y bila nilai awal y = 10 dan x = 0? Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 8
Konversi Tipe Data Konversi secara otomatis (automatic conversion/promotion) Konversi secara eksplisit (casting) Konversi Secara Otomatis Apabila dalam suatu statement terdapat dua variabel dengan tipe yang berbeda, maka salah satu dari variabel tersebut akan dikonversikan berdasarkan urutan berikut: int < unsigned < long < unsigned long < float < double < long double Contoh char c; short s; int i; long l; unsigned u; float f; double d; long double ld; c - s / i dikonversi menjadi int u * 3.1 - i dikonversi menjadi double c + 3 dikonversi menjadi int u - ld dikonversi menjadi long double Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 9
Konversi Secara Eksplisit (casting) Jika i adalah variabel bertipe int, maka (double) i Mengakibat i secara eksplisit terkonversi menjadi tipe double Contoh (float) i + 3 Equivalen dengan ((float) i) + 3 Berhubung operator casting lebih tinggi precedence-nya dari pada operator + maka tanda kurung tidak perlu digunakan x = (float) ((int) y + 1); (double) (x = 77) Tidak sama artinya dengan (double) x = 77 Mengapa? int x = 7, y = 3; float f; f = x / y; Nilai f = 2 f = (float) x / float (y); Nilai f = 2.3 Copyright 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech, Program Studi Teknik Informatika FMIPA Universitas Syiah Kuala 10