Apa perbedaan antara Signed dan Unsigned Int?
Apa perbedaan antara Signed dan Unsigned Int?
Jawaban:
Seperti yang mungkin Anda ketahui, int
s disimpan secara internal dalam biner. Biasanya sebuah int
berisi 32 bit, tetapi di beberapa lingkungan mungkin berisi 16 atau 64 bit (atau bahkan nomor yang berbeda, biasanya tetapi tidak harus memiliki kekuatan dua).
Tetapi untuk contoh ini, mari kita lihat bilangan bulat 4-bit. Mungil, tapi berguna untuk tujuan ilustrasi.
Karena ada empat bit dalam suatu bilangan bulat, ia dapat mengasumsikan salah satu dari 16 nilai; 16 adalah dua pangkat empat, atau 2 kali 2 kali 2 kali 2. Berapa nilai itu? Jawabannya tergantung pada apakah bilangan bulat ini a signed int
atau an unsigned int
. Dengan sebuah unsigned int
, nilainya tidak pernah negatif; tidak ada tanda yang terkait dengan nilai itu. Berikut adalah 16 kemungkinan nilai empat-bit unsigned int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
... dan Berikut adalah 16 kemungkinan nilai empat-bit signed int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
Seperti yang Anda lihat, untuk signed int
s bit paling signifikan adalah 1
jika dan hanya jika angkanya negatif. Itulah sebabnya, bagi signed int
s, bit ini dikenal sebagai "bit tanda".
(unsigned)(-1)
diperlukan untuk menjadi nilai terwakili maksimum untuk unsigned
(terlepas dari representasi biner), yang sebenarnya berlaku untuk komplemen 2, tetapi tidak untuk representasi lainnya.
int
dan unsigned int
dua jenis bilangan bulat yang berbeda. ( int
bisa juga disebut sebagai signed int
, atau just signed
; unsigned int
bisa juga disebut sebagai unsigned
.)
Seperti namanya, int
adalah tipe integer bertanda , dan unsigned int
merupakan tipe integer unsigned . Artinya int
mampu merepresentasikan nilai negatif, dan unsigned int
hanya bisa merepresentasikan nilai non negatif.
Bahasa C memberlakukan beberapa persyaratan pada rentang tipe ini. Kisaran int
harus minimal -32767
.. +32767
, dan rentang dari unsigned int
minimal harus 0
.. 65535
. Ini menyiratkan bahwa kedua jenis harus setidaknya 16 bit. Mereka 32 bit di banyak sistem, atau bahkan 64 bit di beberapa sistem. int
biasanya memiliki nilai ekstra negatif karena representasi dua komplemen yang digunakan oleh kebanyakan sistem modern.
Mungkin perbedaan yang paling penting adalah perilaku aritmatika bertanda vs tidak bertanda. Untuk ditandatangani int
, overflow memiliki perilaku yang tidak ditentukan. Sebab unsigned int
, tidak ada limpahan; operasi apa pun yang menghasilkan nilai di luar rentang tipe membungkus, jadi misalnya UINT_MAX + 1U == 0U
.
Jenis bilangan bulat apa pun, baik bertanda maupun tidak, memodelkan subrentang dari himpunan bilangan bulat matematika yang tak terbatas. Selama Anda bekerja dengan nilai dalam rentang suatu tipe, semuanya berfungsi. Saat Anda mendekati batas bawah atau atas dari suatu tipe, Anda menghadapi diskontinuitas, dan Anda bisa mendapatkan hasil yang tidak diharapkan. Untuk tipe bilangan bulat bertanda, masalah hanya terjadi untuk nilai negatif dan positif yang sangat besar, melebihi INT_MIN
dan INT_MAX
. Untuk tipe integer tak bertanda, masalah terjadi untuk nilai positif yang sangat besar dan nol . Ini bisa menjadi sumber bug. Misalnya, ini adalah pengulangan tanpa batas:
for (unsigned int i = 10; i >= 0; i --) [
printf("%u\n", i);
}
karena i
ini selalu lebih besar dari atau sama dengan nol; itulah sifat tipe unsigned. (Di dalam loop, ketika i
nol, i--
set nilainya menjadi UINT_MAX
.)
Kadang-kadang kita tahu sebelumnya bahwa nilai yang disimpan dalam variabel bilangan bulat tertentu akan selalu positif - jika digunakan hanya untuk menghitung sesuatu, misalnya. Dalam kasus seperti itu, kita dapat mendeklarasikan variabel menjadi unsigned, seperti di unsigned int num student;
,. Dengan deklarasi seperti itu, kisaran nilai integer yang diizinkan (untuk compiler 32-bit) akan bergeser dari kisaran -2147483648 ke +2147483647 ke kisaran 0 hingga 4294967295. Jadi, mendeklarasikan integer sebagai unsigned hampir menggandakan ukuran dari yang terbesar. nilai yang bisa dipegangnya.
Dalam istilah awam, unsigned int adalah bilangan bulat yang tidak boleh negatif dan dengan demikian memiliki rentang nilai positif yang lebih tinggi yang dapat diasumsikan. Int bertanda tangan adalah bilangan bulat yang bisa negatif tetapi memiliki kisaran positif yang lebih rendah sebagai ganti nilai yang lebih negatif yang dapat diasumsikannya.
Dalam praktiknya, ada dua perbedaan:
cout
dalam C ++ atau printf
dalam C): representasi bit integer unsigned diinterpretasikan sebagai integer nonnegatif oleh fungsi cetak.kode ini dapat mengidentifikasi integer menggunakan kriteria pemesanan:
char a = 0;
a--;
if (0 < a)
printf("unsigned");
else
printf("signed");