Saya beralih dari Java ke C ++ dan memiliki beberapa pertanyaan tentang long
tipe data. Di Jawa, untuk menyimpan bilangan bulat lebih besar dari 2 32 , Anda cukup menulis long x;
. Namun, dalam C ++, tampaknya itu long
adalah 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?
c++
long-integer
1110101001
sumber
sumber
long long
mungkin lebih lambat darilong
, yang mungkin lebih lambat dariint
.Jawaban:
long
danlong int
identik. Begitu jugalong long
danlong long int
. Dalam kedua kasus,int
ini opsional.Seperti perbedaan antara dua set, C ++ mandat standar rentang minimum untuk masing-masing, dan itu
long long
adalah pada setidaknya selebarlong
.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 juga tabel 9 dalam
7.1.6.2 Simple type specifiers
, yang menunjukkan "pemetaan" dari penspesifikasi untuk tipe aktual (menunjukkan bahwaint
itu opsional), bagian yang ditunjukkan di bawah ini: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
long
sendiri bukan tipe atau pengubah seperti yang diajukan pertanyaan Anda, itu hanyalah penentu untuklong int
tipe tersebut. Ditto untuklong long
menjadi specifier untuklong long int
tipe 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 dalamC99 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 sebanyakdouble
dan untuk memberikan superset nilai atas tipe itu (berarti setidaknya nilai-nilai itu, belum tentu lebih banyak nilai).sumber
unsigned
danunsigned int
long
setidaknya 32 bit (2 ^ 31-1 di kedua sisi nol) danlong long
setidaknya 64 (2 ^ 63-1 di kedua sisi).long double
dijamin memiliki setidaknya kisarandouble
, 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.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.
sumber
long
sama denganlong int
,short
sama denganshort int
. Along int
adalah tipe integral yang ditandatangani yang setidaknya 32 bit, sedangkan along long
ataulong long int
tipe integral yang ditandatangani setidaknya 64 bit.Ini tidak berarti bahwa a
long long
lebih lebar dari along
. Banyak platform / ABI menggunakanLP64
model - di manalong
(dan pointer) selebar 64 bit. Win64 menggunakanLLP64
, di manalong
masih 32 bit, danlong long
(dan pointer) adalah 64 bit.Ada ringkasan yang bagus dari model data 64-bit di sini .
long double
tidak menjamin banyak selain itu akan setidaknya selebar adouble
.sumber
Ini terlihat membingungkan karena Anda menganggapnya
long
sebagai tipe data itu sendiri.long
tidak lain hanyalah singkatanlong int
ketika Anda menggunakannya sendiri.long
adalah pengubah, Anda dapat menggunakannya dengandouble
juga sebagailong double
.long
==long int
.Keduanya mengambil 4 byte.
sumber
Secara historis, di masa C awal, ketika prosesor memiliki panjang kata 8 atau 16 bit,
int
identik dengan todaysshort
(16 bit). Dalam arti tertentu, int adalah tipe data yang lebih abstrak darichar
,short
,long
ataulong 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 menerjemahkanint
menjadi 64 bit. Jadi ketika Anda ingin variabel Anda memiliki 32 bit dan tidak lebih, lebih baik gunakan eksplisitlong
sebagai 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.]sumber
long
dijamin 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.char
hampir semuanya 8 bit,short
16, danlong
32;int
bisa 16 atau 32. Catatan untuk beberapa platform (khususnya 68000) baik 16-bit dan 32-bitint
sangat umum, dan memang beberapa kompiler memiliki opsi untuk mendukung keduanya. Kode yang perlu portabel dengan demikian diharapkan untuk digunakanshort
ataulong
dalam preferensiint
.Sementara di Java
long
selalu 64 bit, dalam C ++ ini tergantung pada arsitektur komputer dan sistem operasi . Sebagai contoh,long
64 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:Ini (
int*_t
) dapat digunakan setelah menyertakan<cstdint>
tajuk.size_t
adalah di<stdlib.h>
.sumber