Apa perbedaan antara "long", "long long", "long int", dan "long long int" di C ++?

210

Saya beralih dari Java ke C ++ dan memiliki beberapa pertanyaan tentang longtipe data. Di Jawa, untuk menyimpan bilangan bulat lebih besar dari 2 32 , Anda cukup menulis long x;. Namun, dalam C ++, tampaknya itu longadalah tipe data dan pengubah.

Tampaknya ada beberapa cara untuk digunakan long:

long x;
long long x;
long int x;
long long int x;

Juga, sepertinya ada beberapa hal seperti:

long double x;

dan seterusnya.

Apa perbedaan antara semua tipe data yang beragam ini, dan apakah semuanya memiliki tujuan yang sama?

1110101001
sumber
2
@ user2612743 - agar aman, pikirkan tentang apa kebutuhan Anda dan gunakan jenis yang sesuai. long longmungkin lebih lambat dari long, yang mungkin lebih lambat dari int.
Pete Becker
1
Tidak, "aman, lama-lama" sama dengan mengatakan "aman, cukup berikan semua orang satu AIDS di bumi, jadi kita tidak perlu khawatir tentang seks aman, kita semua sudah mendapatkannya bagaimanapun!" Konyol, bukan? Pikirkan tentang data dan nilai apa yang mungkin dimiliki, dan gunakan tipe yang paling pas. Ini juga membantu kompiler membuat optimasi tambahan tanpa melanggar maksud kode asli, seperti jika ia harus memuat pustaka tambahan untuk menangani angka yang lebih besar daripada lebar bit alami dari platform target.
CM
Menggunakan long lama dengan win32 listbox dan sejenisnya tidak akan bermain malapetaka dengan memori Anda dan variabel lainnya - bahkan jika batas tidak dilanggar. Bahkan dengan peringatan C4244 yang tampak tidak berbahaya itu tidak mudah dideteksi.
Laurie Stearn

Jawaban:

182

longdan long intidentik. Begitu juga long longdan long long int. Dalam kedua kasus, intini opsional.

Seperti perbedaan antara dua set, C ++ mandat standar rentang minimum untuk masing-masing, dan itu long longadalah pada setidaknya selebar long.

Bagian pengontrol standar (C ++ 11, tetapi ini sudah ada sejak lama), misalnya 3.9.1 Fundamental types, bagian 2 (bagian selanjutnya memberikan aturan yang sama untuk tipe integral yang tidak ditandatangani):

Ada lima tipe integer bertanda tangan standar: char yang ditandatangani, int pendek, int, int panjang, dan int panjang panjang. Dalam daftar ini, masing-masing jenis menyediakan penyimpanan setidaknya sebanyak yang sebelumnya dalam daftar.

Ada juga tabel 9 dalam 7.1.6.2 Simple type specifiers, yang menunjukkan "pemetaan" dari penspesifikasi untuk tipe aktual (menunjukkan bahwa intitu opsional), bagian yang ditunjukkan di bawah ini:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

Perhatikan perbedaan antara specifier dan jenisnya. Specifier adalah bagaimana Anda memberi tahu kompiler apa jenisnya, tetapi Anda dapat menggunakan specifier berbeda untuk berakhir pada tipe yang sama.

Oleh karena itu longsendiri bukan tipe atau pengubah seperti yang diajukan pertanyaan Anda, itu hanyalah penentu untuk long inttipe tersebut. Ditto untuk long longmenjadi specifier untuk long long inttipe tersebut.

Meskipun standar C ++ itu sendiri tidak menentukan rentang minimum tipe integral, ia mengutip C99, dalam 1.2 Normative references, sebagai penerapan. Karenanya rentang minimal yang ditetapkan dalam C99 5.2.4.2.1 Sizes of integer types <limits.h>berlaku.


Dalam hal long double, itu sebenarnya nilai floating point daripada bilangan bulat. Demikian pula untuk tipe integral, itu diperlukan untuk memiliki setidaknya presisi sebanyak doubledan untuk memberikan superset nilai atas tipe itu (berarti setidaknya nilai-nilai itu, belum tentu lebih banyak nilai).

paxdiablo
sumber
4
hal yang sama dengan unsigneddanunsigned int
Kal
2
Saya cukup yakin longsetidaknya 32 bit (2 ^ 31-1 di kedua sisi nol) dan long longsetidaknya 64 (2 ^ 63-1 di kedua sisi).
chris
2
Dan long doubledijamin memiliki setidaknya kisaran double, tetapi mungkin sama. Itu tergantung pada komputer. Beberapa FPU telah meningkatkan presisi; chip x87 memiliki presisi tunggal 32-bit, presisi ganda 64-bit, dan presisi diperluas 80-bit.
Eric Jablow
Adapun persyaratan rentang, standar C ++ 11 merujuk standar C11, yang memiliki rentang aktual.
chris
Bagian "int" hanya membedakan antara tipe integer dan floating point, karakter, atau tipe non-integer lainnya. Dalam banyak kasus, ini dapat disimpulkan oleh kompiler, sehingga dapat dijatuhkan - Inilah mengapa "unsigned" sama dengan "unsigned int", misalnya. Bagian "int" hanya diasumsikan kecuali programmer menentukan sesuatu yang lain, seperti "char" atau "double". Adapun ukuran aktual yang digunakan .. tergantung pada standar yang Anda baca, masing-masing ukuran mungkin memiliki jumlah bit minimum, tetapi mereka semua didefinisikan sedemikian sehingga masing-masing setidaknya sama besar dengan jenis sebelumnya.
CM
64

Panjang dan panjang int setidaknya 32 bit.

panjang dan panjang int setidaknya 64 bit. Anda harus menggunakan kompiler c99 atau lebih baik.

ganda panjang agak aneh. Lihat di Wikipedia untuk detailnya.

Eric Lippert
sumber
17

longsama dengan long int, shortsama dengan short int. A long intadalah tipe integral yang ditandatangani yang setidaknya 32 bit, sedangkan a long longatau long long inttipe integral yang ditandatangani setidaknya 64 bit.

Ini tidak berarti bahwa a long longlebih lebar dari a long. Banyak platform / ABI menggunakan LP64model - di mana long(dan pointer) selebar 64 bit. Win64 menggunakan LLP64, di mana longmasih 32 bit, dan long long(dan pointer) adalah 64 bit.

Ada ringkasan yang bagus dari model data 64-bit di sini .

long doubletidak menjamin banyak selain itu akan setidaknya selebar a double.

Brett Hale
sumber
7

Ini terlihat membingungkan karena Anda menganggapnya longsebagai tipe data itu sendiri.

longtidak lain hanyalah singkatan long intketika Anda menggunakannya sendiri.

longadalah pengubah, Anda dapat menggunakannya dengan doublejuga sebagai long double.

long== long int.

Keduanya mengambil 4 byte.

Siraj Alam
sumber
Lama mengambil 4 byte hanya berlaku pada Win64, itu tergantung platform
Prodigle
1
Ya jelas ... tidak hanya panjang ... int membutuhkan 4 byte dan 2 byte tergantung pada platformnya, tidak diragukan lagi.
Siraj Alam
3

Secara historis, di masa C awal, ketika prosesor memiliki panjang kata 8 atau 16 bit, intidentik dengan todays short(16 bit). Dalam arti tertentu, int adalah tipe data yang lebih abstrak dari char, short, longatau long long, karena Anda tidak bisa yakin tentang bitwidth tersebut.

Ketika mendefinisikan int n;Anda bisa menerjemahkan ini dengan "beri saya kompromi terbaik dari bitwidth dan kecepatan pada mesin ini untuk n". Mungkin di masa depan Anda harus mengharapkan kompiler menerjemahkan intmenjadi 64 bit. Jadi ketika Anda ingin variabel Anda memiliki 32 bit dan tidak lebih, lebih baik gunakan eksplisit longsebagai tipe data.

[Sunting: #include <stdint.h>tampaknya menjadi cara yang tepat untuk memastikan bitwidth menggunakan tipe int ## _ t, meskipun itu belum menjadi bagian dari standar.]

thomiel
sumber
2
Bagian terakhir itu, menggunakan "panjang" untuk mendapatkan 32-bit ketika int 64-bit, salah. Jika int adalah 64-bit, maka panjang akan setidaknya 64-bit, juga. Long dijamin setidaknya sebesar int, meskipun mungkin lebih besar, tetapi tidak pernah lebih kecil. Kebanyakan kompiler memiliki berbagai metode yang memungkinkan programmer untuk lebih spesifik, seperti tipe __int32 (non-portable) yang persis 32-bit, dan sebagainya.
CM
1
Seperti yang didefinisikan dalam standar C, a longdijamin setidaknya 32 bit. (Standar dapat berubah sulit.) Draf C ++ 14 saat ini hanya mengatakan: @ CM "Dataran int memiliki ukuran alami yang disarankan oleh arsitektur lingkungan eksekusi jenis integer bertanda tangan lain disediakan untuk memenuhi kebutuhan khusus" (bagian 3.9.1 ). Saya tidak menemukan berita tentang hubungan panjang berbagai int di dalamnya. __int32 sebenarnya bukan bagian dari standar, tetapi karena C ++ 11 ada typedef yang tersedia seperti int_fast32_t atau int_least32_t tersedia untuk memberi Anda apa yang Anda inginkan.
thomiel
Saya akan mengatakan bahwa pada implementasi abad ke-20 untuk mikrokomputer yang dapat diprogram ulang untuk keperluan umum, charhampir semuanya 8 bit, short16, dan long32; intbisa 16 atau 32. Catatan untuk beberapa platform (khususnya 68000) baik 16-bit dan 32-bit intsangat umum, dan memang beberapa kompiler memiliki opsi untuk mendukung keduanya. Kode yang perlu portabel dengan demikian diharapkan untuk digunakan shortatau longdalam preferensi int.
supercat
0

Sementara di Java longselalu 64 bit, dalam C ++ ini tergantung pada arsitektur komputer dan sistem operasi . Sebagai contoh, long64 bit adalah pada Linux dan 32 bit pada Windows (ini dilakukan untuk menjaga kompatibilitas, memungkinkan program 32-bit untuk dikompilasi pada Windows 64-bit tanpa perubahan).

Gaya C ++ dianggap baik untuk dihindari short int long ... dan sebagai gantinya menggunakan:

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

Ini ( int*_t) dapat digunakan setelah menyertakan <cstdint>tajuk. size_tadalah di <stdlib.h>.

xjcl
sumber