Apa perbedaan antara Signed dan Unsigned Int?
c
unsigned-integer
signed-integer
Moumita Das
sumber
sumber
Jawaban:
Seperti yang mungkin Anda ketahui,
int
s disimpan secara internal dalam biner. Biasanya sebuahint
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 anunsigned int
. Dengan sebuahunsigned int
, nilainya tidak pernah negatif; tidak ada tanda yang terkait dengan nilai itu. Berikut adalah 16 kemungkinan nilai empat-bitunsigned 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 adalah1
jika dan hanya jika angkanya negatif. Itulah sebabnya, bagisigned int
s, bit ini dikenal sebagai "bit tanda".sumber
(unsigned)(-1)
diperlukan untuk menjadi nilai terwakili maksimum untukunsigned
(terlepas dari representasi biner), yang sebenarnya berlaku untuk komplemen 2, tetapi tidak untuk representasi lainnya.int
danunsigned int
dua jenis bilangan bulat yang berbeda. (int
bisa juga disebut sebagaisigned int
, atau justsigned
;unsigned int
bisa juga disebut sebagaiunsigned
.)Seperti namanya,
int
adalah tipe integer bertanda , danunsigned int
merupakan tipe integer unsigned . Artinyaint
mampu merepresentasikan nilai negatif, danunsigned int
hanya bisa merepresentasikan nilai non negatif.Bahasa C memberlakukan beberapa persyaratan pada rentang tipe ini. Kisaran
int
harus minimal-32767
..+32767
, dan rentang dariunsigned int
minimal harus0
..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. Sebabunsigned int
, tidak ada limpahan; operasi apa pun yang menghasilkan nilai di luar rentang tipe membungkus, jadi misalnyaUINT_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
danINT_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, ketikai
nol,i--
set nilainya menjadiUINT_MAX
.)sumber
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.sumber
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.
sumber
Dalam praktiknya, ada dua perbedaan:
cout
dalam C ++ atauprintf
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");
sumber