Sampai sekarang, dalam seri tutorial pemrograman C yang sedang berlangsung ini, kita telah membahas beberapa konsep, tetapi melewatkan satu konsep dasar. Ini tentang angka negatif. Ya, meskipun kami secara singkat menyebutkan variabel yang ditandatangani vs yang tidak ditandatangani di salah satu tutorial awal kami, kami tidak benar-benar membahas bagaimana angka negatif disimpan dalam memori.
Nah, itulah yang akan dibahas dalam tutorial ini. Jadi tanpa basa-basi lagi, mari kita mulai pembahasannya.
pelengkap 2
Sebelum kita mulai dengan penjelasan tentang representasi bilangan negatif dalam memori, ada baiknya kita mengetahui konsep komplemen 1 dan 2 yang keduanya merupakan operasi level biner.
Mari kita ambil contoh yang sangat sederhana. Misalkan Anda memiliki 4 byte integer 'a' dengan nilai desimal 15. Kemudian berikut ini bagaimana itu direpresentasikan dalam memori bentuk biner:
00000000 00000000 00000000 00001111
Sekarang, untuk menghitung komplemen satu, cukup balikkan semua bitnya. Jadi berikut adalah representasi komplemen 1 dari 15:
11111111 11111111 11111111 11110000
Sekarang, jika Anda menambahkan 1 ke representasi biner di atas, Anda mendapatkan komplemen 2.
11111111 11111111 11111111 11110001
Jadi representasi di atas adalah komplemen dua dari 15.
Bilangan negatif
Sekarang, beberapa dari Anda pasti berpikir mengapa kita membahas komplemen 1 dan 2? Nah, jawabannya terletak pada kenyataan bahwa representasi biner dari bilangan negatif dihitung melalui komplemen 2.
Sulit untuk dipercaya? Ini buktinya:
Komplemen 2 yang kami hitung di bagian sebelumnya dapat direpresentasikan dalam bentuk heksadesimal sebagai 0xFFFFFFF1. Sekarang, mari kita lihat berapa nilai ini dalam bentuk desimal melalui program C
Ini kodenya:
#include <stdio.h>
int main()
{
int a = 0xFFFFFFF1;
printf("a = %d", a);
return 0;
}
Dan berikut adalah outputnya:
a = -15
Percaya sekarang? Kami mulai dengan angka '15', menghitung komplemen 2-nya, dan ketika kami mengubah nilai komplemen keduanya lagi menjadi desimal, kami menemukan itu -15.
Selanjutnya, sekarang mari kita sedikit mengubah kode untuk memastikan panggilan printf membaca nilai variabel 'a'
#include <stdio.h>
int main()
{
int a = 0xFFFFFFF1;
printf("a = %u", a);
return 0;
}
Inilah hasilnya sekarang:
a = 4294967281
Ups, output berubah, dan sekarang nilai positifnya sangat besar. Tapi mengapa ini terjadi? Bukankah 0xFFFFFFFF1 komplemen 2 dari 15 seperti yang kita lihat sebelumnya?
Ya, 0xFFFFFFF1 adalah komplemen dua dari 15, tetapi jika Anda tidak melihatnya dari perspektif itu, itu juga merupakan nilai normal (4294967281). Perbedaannya terletak pada cara membacanya. Jika dibaca sebagai integer bertanda (melalui %d di printf), Anda akan melihat output sebagai -15, tetapi jika dibaca sebagai unsigned integer (melalui %u di printf), Anda akan melihat output sebagai 4294967281.
Sebagai aturan praktis dengan variabel bertanda (yang berhubungan dengan nilai negatif dan positif), perlu diingat bahwa representasi biner dari bilangan negatif selalu memiliki '1' sebagai bit paling kiri, sedangkan untuk bilangan positif bit yang dimaksud selalu 0.
Terakhir, perhatikan bahwa Anda juga dapat membalikkan representasi komplemen dua untuk mendapatkan padanan positifnya. Sebagai contoh, mari kita ambil lagi nilai 0xFFFFFFF1, yang merupakan representasi heksa dari -15. Ini direpresentasikan dalam bentuk biner sebagai:
11111111 11111111 11111111 11110001
Sekarang, untuk mendapatkan pasangan positifnya, lakukan saja komplemen 2 lagi. Artinya, lakukan komplemen a 1 dulu:
00000000 00000000 00000000 00001110
Dan kemudian tambahkan 1
00000000 00000000 00000000 00001111
Sekarang, jika Anda mengonversinya, Anda akan mendapatkan nilai 15 dalam bentuk desimal.
Kesimpulan
Saya harap tutorial ini membantu Anda memahami konsep bilangan negatif dalam konteks bagaimana mereka direpresentasikan dalam memori. Saya sarankan Anda mencoba contoh yang kami gunakan dalam tutorial ini, dan jika Anda mengalami masalah, atau Anda memiliki keraguan atau pertanyaan, beri kami komentar di bawah.