Apa perbedaan antara Signed dan Unsigned Int


91

Apa perbedaan antara Signed dan Unsigned Int?


5
Ini adalah pertanyaan nyata, dan jawabannya tidak sesederhana itu, tetapi agak halus.
R .. GitHub STOP HELPING ICE

Memberi suara untuk dibuka kembali. Ini mungkin duplikat, tapi itu pasti pertanyaan nyata.
Brian


Lebih banyak tag harus ditambahkan, karena banyak bahasa menggunakannya.
Juan Boero

Pertanyaan ini mungkin membutuhkan satu bab untuk diuraikan. Jika Anda ingin mengetahui seluk beluknya, periksa Unsigned and Signed Integers untuk penjelasan lebih lanjut.
anonim

Jawaban:


113

Seperti yang mungkin Anda ketahui, ints disimpan secara internal dalam biner. Biasanya sebuah intberisi 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 intatau 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 ints bit paling signifikan adalah 1jika dan hanya jika angkanya negatif. Itulah sebabnya, bagi signed ints, bit ini dikenal sebagai "bit tanda".


11
Mungkin yang perlu diperhatikan adalah bahwa ini adalah format pelengkap keduanya, yang sekarang banyak digunakan. Ada juga cara lain untuk merepresentasikan bilangan bulat bertanda tangan, terutama pelengkap.
Penjadwal

Benar. Dan standar ISO9899 C bahkan tidak mengharuskan penggunaan satu atau dua pelengkap; konvensi lain apa pun yang benar-benar berfungsi diperbolehkan.
Bill Evans di Mariposa

1
Meskipun komplemen dua tidak diperlukan, (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.
rubenvb

3
@BillEvansatMariposa: Standar mengatakan bahwa untuk bilangan bulat bertanda ada 3 representasi yang diizinkan: tanda + besarnya, komplemen 2, komplemen 1. Yang lain harus tidak terlihat oleh program dan dianggap sebagai salah satu dari 3 ini.
Alexey Frunze

Ok tapi di balik terpal! Apa yang BENAR-BENAR terjadi! Apa perbedaan antara nomor SIGNED dan UNSIGNED! Bagaimana mesin mengelola komputasi? Itu hanya mengurangi nilai dari yang lain? Bagaimana perbedaannya 1111 = 15 dan 1111 = -1?
Mihail Georgescu

19

intdan unsigned intdua jenis bilangan bulat yang berbeda. ( intbisa juga disebut sebagai signed int, atau just signed; unsigned intbisa juga disebut sebagai unsigned.)

Seperti namanya, intadalah tipe integer bertanda , dan unsigned intmerupakan tipe integer unsigned . Artinya intmampu merepresentasikan nilai negatif, dan unsigned inthanya bisa merepresentasikan nilai non negatif.

Bahasa C memberlakukan beberapa persyaratan pada rentang tipe ini. Kisaran intharus minimal -32767.. +32767, dan rentang dari unsigned intminimal 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. intbiasanya 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_MINdan 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 iini selalu lebih besar dari atau sama dengan nol; itulah sifat tipe unsigned. (Di dalam loop, ketika inol, i--set nilainya menjadi UINT_MAX.)


12

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.


@Alex Saya sedang mengedit jawaban itu 10 menit yang lalu dan itu identik. lol
Skuld

12

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.


0

Dalam praktiknya, ada dua perbedaan:

  1. pencetakan (misalnya dengan coutdalam C ++ atau printfdalam C): representasi bit integer unsigned diinterpretasikan sebagai integer nonnegatif oleh fungsi cetak.
  2. pemesanan : pemesanan tergantung pada spesifikasi yang ditandatangani atau tidak ditandatangani.

kode ini dapat mengidentifikasi integer menggunakan kriteria pemesanan:

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

Jika ini dijelaskan berbeda dengan yang satu berurusan dengan angka negatif dan yang lainnya tidak. Ini akan sangat membantu posting ini.
Daniel Jackson

@DanielJackson Tidak jelas apa yang Anda katakan. sebuah karakter dapat dianggap negatif atau positif tergantung pada penyusunnya. keluaran kode tergantung pada apa yang dipilih kompilator dan ini menunjukkan perbedaan antara ditandatangani dan tidak ditandatangani.
Minimus Heximus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.