GNU/Linux >> Belajar Linux >  >> Linux

Tutorial Pemrograman Linux C Bagian 15 - Pelengkap 2s dan Angka Negatif

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' sebagai bilangan bulat tidak bertanda.

#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.


Linux
  1. Tutorial Perintah Linux nice and renice (7 Contoh)

  2. Tutorial Pemrograman C Bagian 5 - Variabel karakter

  3. Tutorial Pemrograman Linux C Bagian 10 - Lingkup Variabel

  1. Tutorial Pemrograman Linux C Bagian 9 :String

  2. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  3. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  1. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  2. Tutorial Pemrograman Linux C Bagian 14 - Contoh praktis operator Bitwise

  3. Tutorial Pemrograman Linux C Bagian 12 - Operator Penugasan dan Ekspresi Bersyarat