Tipe data dan Format Specifier

Setiap variabel dalam bahasa C++ dideklarasikan dengan tipe data sesuai nilai yang akan diberikan. Di antara beberapa tipe data yang ada, ada tipe data yang disebut tipe data dasar seperti float, integer dan sejenisnya. Ada juga tipe data bentukan yang dihasilkan dari pengembangan tipe data dasar tersebut seperti array, pointer, struct, union, string, dan enumerasi.
  1. Tipe data Boolean (bool)
  2. Tipe data Character (char)
  3. Tipe data Integer (int)
  4. Tipe data float
  5. Tipe data double
  6. Tipe data string
  7. Tipe data enumerasi
  8. Tipe Data Valueless (void)
Tipe data dasar dapat digunakan untuk menyimpan satu nilai, terutama angka dan karakter. Tiap tipe data dasar tersebut juga punya ukuran dalam byte dan rentang nilai yang berbeda-beda. Jika nilai yang diberikan tidak sesuai, apa yang disimpan oleh variabel tersebut juga tidak akan sesuai dengan keinginan kita.

Unsigned VS Signed
Tiap tipe data dasar juga punya versi signed dan unsigned. Penambahan signed dan unsigned tidak mengubah ukuran dan rentang nilai suatu tipe data. Walaupun tidak mengubah ukuran nilainya dalam byte, signed dan unsigned akan mempengaruhi awal dan akhir dari nilai yang bisa diberikan.

Unsigned hanya akan menerima nilai positif, dan tidak bisa menyimpan angka negatif. Dengan kata lain, tipe unsigned dimulai dari 0 dengan nilai akhir sekitar 2 kali lipat dari versi signed-nya, walaupun rentang nilainya tetap sama.

Berbeda dengan unsigned, signed dimulai dari bilangan negatif. Contohnya, signed char dan unsigned char sama-sama berukuran 1 byte, walaupun nilai awal dan akhirnya berbeda. Secara default, seharusnya semua tipe data dasar akan bertipe signed.

Tipe data 
Memori Rentang nilai
Format Specifier
short int                      
2
-32,768 .. 32,767
%hd
unsigned short int                                               
2
0 .. 65,535
%hu
unsigned int
4
0 .. 4,294,967,295
%u
int
4
-2,147,483,648 .. 2,147,483,647
%d
long int
4
-2,147,483,648 to 2,147,483,647
%ld
unsigned long int
4
0 to 4,294,967,295
%lu
long long int
8
-(2^63)..(2^63)-1
%lld
unsigned long long int
8
0..18,446,744,073,709,551,615
%llu
signed char
1
-128..127
%c
unsigned char
1
0..255
%c
Float
4

%f
double 8
%lf
long double
12

%ld

Format Specifier

Format Specifier bisa digunakan jika kita ingin menampilkan nilai dengan printf. Contohnya adalah seperti di bawah ini.
#include <iostream>

int main(){
int angka=5;
float nilai;
     nilai=6.1;
     printf("%d", angka);
     printf(" dan ");
     printf("%0.3f", nilai);
     return 0;
}
Perhatikan!
Untuk tipe data int / bilangan bulat, specifier yang digunakan adalah %d. Sedangkan untuk tipe data float bilangan pecahan desimal, format specifier yang digunakan adalah %f.

Kita bisa menyelipkan angka yang menandakan jumlah digit minimal dan juga jumlah desimalnya. Angka sebelum titik menandakan jumlah digit minimal, dan angka setelah titik menandakan jumlah digit di belakang koma.

"%2.3f" menandakan jika digit minimalnya ada dua, dan ada tiga digit di belakang koma. Jika jumlah digitnya kurang dari digit minimal, akan ada penambahan spasi.

Contoh di atas bisa juga dipersingkat sehingga menjadi seperti di bawah ini.
#include <stdio.h>
int main(){
int angka=5;
    float nilai;
    nilai=6.1;
    printf("%d dan %0.3f", angka, nilai);
    printf(" ");
    return 0;
}
Dalam bahasa C dan C++, angka dan karaker disimpan dengan cara yang sama. Karakter disimpan dalam bentuk angka sesuai dengan kode ASCII-nya. Contohnya, huruf 'A' disimpan sebagai angka 65. Jadi angka 65 dan 'A' sebenarnya adalah nilai yang sama.

Kita bisa menentukan apakah suatu variabel ditampilkan berdasarkan angkanya, atau kode ASCII-nya. Bahkan, jika mau kita juga bisa menampilkan angkanya dalam bentuk bilangan hexadesimal.
#include <stdio.h>

int main(){
int angka=65;
     printf("Bilangan bulat desimal : %d\n", angka);
     printf("karakter : %c\n", angka);
     printf("Bilangan hexadesimal : %x\n", angka);

     return 0;
}
Dari hasil kode program di atas, kalian bisa melihat bahwa sekalipun yang ditampilkan adalah variabel yang sama, apa yang akan terlihat ditentukan oleh format specifiernya. Selain dengan menulisnya sebagai angka, karakter juga bisa ditulis dengan mengapit satu karakter di antara tanda kutip tunggal(').

Pada contoh di atas saya sengaja menukar format specifier untuk karakter dan format specifier untuk bilangan bulat. Sekalipun nilai yang disimpan berbeda, pada akhirnya format specifierlah yang akan menentukan hasilnya.

Mendeklarasikan Tipe Data Baru dengan Typedef
Selain menggunakan tipe data yang sudah ada, kita juga bisa mendeklarasikan tipe data baru dari tipe data yang sudah ada. Untuk mendeklarasikan tipe data buatan kita sendiri, kita bisa mengawali deklarasi tipe data buatan kita dengan kata "typedef". Contoh :
#include <stdio.h>

typedef char stringku[256];

int main(){
stringku kalimat1="Halo";
stringku kalimat2="dunia";
    printf("%s %s!", kalimat1, kalimat2);
    return 0;
}
Setelah tipe data baru dibuat, kita bisa menggunakan tipe data buatan kita di dalam deklarasi variabel. Pada contoh di atas, kata adalah tipe data bentukan kita sendiri yang berasal dari array dengan tipe data char.