Perbedaan antara size_t dan unsigned int?

107

Saya sangat bingung size_t. Saya telah mencari di internet dan di mana-mana menyebutkan bahwa itu size_tadalah tipe unsigned jadi, itu hanya mewakili nilai-nilai non-negatif.

Pertanyaan pertama saya adalah: jika digunakan untuk mewakili hanya nilai-nilai non-negatif, kenapa tidak kita gunakan unsigned intbukan size_t?

Pertanyaan kedua saya adalah: are size_tand unsigned intinterchangeable or not? Jika tidak, lalu mengapa?

Dan adakah yang bisa memberi saya contoh yang baik size_tdan secara singkat cara kerjanya?

Vikas Verma
sumber
5
typedef /*This part is implementation dependent */ size_t;
P0W
5
kemungkinan duplikat dari unsigned int vs. size_t

Jawaban:

87

jika digunakan untuk mewakili nilai non negatif jadi mengapa kami tidak menggunakan unsigned intsebagai gantinyasize_t

Karena unsigned intbukan satu-satunya tipe integer unsigned. size_tbisa menjadi salah unsigned char, unsigned short, unsigned int, unsigned longatau unsigned long long, tergantung pada pelaksanaannya.

Pertanyaan kedua adalah itu size_tdan unsigned intdapat dipertukarkan atau tidak dan jika tidak, lalu mengapa?

Mereka tidak dapat dipertukarkan, untuk alasan yang dijelaskan di atas ^^.

Dan adakah yang bisa memberi saya contoh yang bagus tentang size_t dan cara kerjanya yang singkat?

Saya tidak mengerti apa yang Anda maksud dengan "pekerjaan singkatnya". Ia bekerja seperti jenis unsigned lainnya (khususnya, seperti jenis yang diketikkannya). Anda didorong untuk menggunakan size_tsaat Anda menjelaskan ukuran suatu benda. Secara khusus, sizeofoperator dan berbagai fungsi pustaka standar, seperti strlen(), return size_t.

Bonus: inilah artikel bagus tentang size_t(dan ptrdiff_tjenis yang terkait erat ). Itu alasan yang sangat baik mengapa Anda harus menggunakannya.

Santhosh Kumar
sumber
1
Bagaimana tepatnya bisa size_tmenjadi unsigned char? Apakah ini dalam standar yang diperbolehkan? Maksud saya dengan gagasan itu bagaimana orang bisa diharapkan untuk menggunakan calloc()(dan keluarga), strlen()dll.? Bagi saya itu tidak masuk akal.
Pryftan
Saya pikir size_tdidefinisikan dalam standar sebagai "tipe integer unsigned", tetapi tidak memerlukannya untuk menjadi sama seperti salah satu dari unsigned {char, short, int, long, long long}.
Paul Hankin
80

Ada 5 tipe integer unsigned standar di C:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

dengan berbagai persyaratan untuk ukuran dan kisarannya (singkatnya, setiap kisaran jenis adalah bagian dari kisaran jenis berikutnya, tetapi beberapa di antaranya mungkin memiliki kisaran yang sama).

size_tadalah typedef(yaitu, alias) untuk beberapa tipe unsigned, (mungkin salah satu dari yang di atas tapi mungkin tipe integer unsigned yang diperluas , meskipun itu tidak mungkin). Ini adalah tipe yang dihasilkan oleh sizeofoperator.

Pada satu sistem, mungkin masuk akal untuk digunakan unsigned intuntuk merepresentasikan ukuran; di sisi lain, mungkin lebih masuk akal untuk menggunakan unsigned longatau unsigned long long. ( size_ttidak mungkin menjadi salah satu unsigned charatau unsigned short, tetapi itu diizinkan).

Tujuan size_tadalah untuk meringankan programmer dari keharusan untuk khawatir tentang yang jenis yang telah ditetapkan digunakan untuk mewakili ukuran.

Kode yang mengasumsikan sizeofhasil unsigned inttidak akan portabel. Kode yang mengasumsikannya menghasilkan a size_tlebih cenderung portabel.

Keith Thompson
sumber
6
Saya pikir ini harus menjadi jawaban yang diterima karena menjelaskan mengapa Anda harus menggunakan size_t
kuchi
@ Keith-thompson jadi apakah ini berarti bahwa jenis tertentu (mis unsigned int. unsigned long, dll.) yang size_tsesuai bergantung pada mesin tempat kode dijalankan? yaitu pada satu arsitektur mesin, itu sesuai dengan unsigned inttetapi pada arsitektur lain itu akan sesuai unsigned long, dll?
Richie Thomas
1
@RichieThomas: Itu tergantung pada implementasi C. Dua kompiler berbeda pada arsitektur yang sama mungkin memilih tipe yang berbeda size_t, terutama jika, misalnya, unsigned longdan unsigned long longberukuran sama.
Keith Thompson
@RichieThomas Itu bagian dari itu juga. Artinya, maks long, long longdll. limits.hBergantung pada sistem: Jika Anda perhatikan, setidaknya di bawah Unices, Anda akan melihat bahwa nilai maks untuk int tergantung pada ukuran kata dari sistem.
Pryftan
1
@Pryftan Lihatlah seri Motorola 68000, juga seri Intel x86 yang lebih lama (kembali ke 8086 dan 8088).
Keith Thompson
10

size_t memiliki batasan tertentu.

Mengutip dari http://www.cplusplus.com/reference/cstring/size_t/ :

Alias ​​dari salah satu tipe integer unsigned fundamental.

Ini adalah tipe yang dapat mewakili ukuran objek dalam byte : size_t adalah tipe yang dikembalikan oleh operator sizeof dan digunakan secara luas di perpustakaan standar untuk merepresentasikan ukuran dan jumlah.

Itu tidak dapat dipertukarkan dengan unsigned intkarena ukuran intditentukan oleh model data. Misalnya LLP64 menggunakan 32-bit intdan ILP64 menggunakan 64-bit int.

DrYap
sumber
5
Dari mana kutipan itu berasal? (Ini bukan dari standar C.)
Keith Thompson
2
Pertanyaan diberi tag c . Standar C ++ tidak ada hubungannya dengan C.
IInspectable
7

size_t digunakan untuk menyimpan ukuran objek data, dan dijamin dapat menampung ukuran objek data apa pun yang dapat dibuat oleh implementasi C tertentu. Tipe data ini mungkin lebih kecil (dalam jumlah bit), lebih besar atau sama persis dengan unsigned int.

Thomas Padron-McCarthy
sumber
4

Selain jawaban lain, ia juga mendokumentasikan kode dan memberi tahu orang-orang bahwa Anda berbicara tentang ukuran objek dalam memori

Ed Heal
sumber
Poin yang bagus. Sebuah appleadalah apel , seorang size_tadalah ukuran ...
dom_beau
2

size_t type adalah tipe bilangan bulat unsigned dasar dari bahasa C / C ++. Ini adalah jenis hasil yang dikembalikan oleh operator sizeof. Ukuran tipe dipilih sehingga bisa menyimpan ukuran maksimum dari array yang secara teoritis memungkinkan dari tipe apapun. Pada sistem 32-bit size_t akan mengambil 32 bit, pada 64-bit 64 bit. Dengan kata lain, variabel tipe size_t dapat menyimpan pointer dengan aman. Pengecualiannya adalah pointer ke fungsi kelas tetapi ini adalah kasus khusus. Meskipun size_t dapat menyimpan pointer, lebih baik menggunakan tipe integer unsigned lain uintptr_t untuk tujuan itu (namanya mencerminkan kemampuannya). Jenis size_t dan uintptr_t adalah sinonim. tipe size_t biasanya digunakan untuk penghitung loop, pengindeksan array dan aritmatika alamat. Nilai maksimum yang mungkin dari jenis size_t adalah konstan SIZE_MAX.

pengguna2873459
sumber
1
size_tdapat menyimpan ukuran satu objek. Penunjuk dapat menunjuk ke byte mana pun dari objek apa pun. Anda dapat memiliki sistem dengan, misalnya, ruang alamat 64-bit yang membatasi ukuran satu objek menjadi 2 ** 32-1 byte. Tidak ada jaminan bahwa size_tdan uintptr_tmerupakan tipe yang sama.
Keith Thompson
1

Dengan kata sederhana size_t adalah platform dan juga tergantung pada implementasi sedangkan unsigned int hanya bergantung pada platform.

Kaushal Billore
sumber