Standar tidak mengatakan apa-apa tentang ukuran pasti dari semua tipe bilangan bulat selain dari char
. Biasanya, long
adalah 32-bit pada sistem 32-bit dan 64-bit pada sistem 64-bit.
Namun standar tersebut menentukan minimum ukuran. Dari bagian 5.2.4.2.1 Standar C:
1 Nilai yang diberikan di bawah harus diganti dengan ekspresi konstanta yang sesuai untuk digunakan dalam
#if
arahan prapemrosesan. Selain itu, kecuali untukCHAR_BIT
danMB_LEN_MAX
, ekspresi berikut akan diganti dengan ekspresi yang memiliki tipe yang sama dengan ekspresi yang merupakan objek dari tipe yang sesuai yang dikonversi menurut promosi bilangan bulat. Nilai yang ditentukan penerapannya harus sama atau lebih besar (nilai absolut) dengan yang ditampilkan, dengan tanda yang sama....
nilai minimum untuk objek bertipe
long int
LONG_MIN
-2147483647 // −(2^31−1)nilai maksimum untuk objek bertipe
long int
LONG_MAX
+2147483647 // 2^31−1
Ini mengatakan bahwa long int
harus minimal 32 bit, tetapi mungkin lebih besar. Di mesin tempat CHAR_BIT
adalah 8, ini memberikan ukuran byte minimum 4. Namun pada mesin dengan mis. CHAR_BIT
sama dengan 16, sebuah long int
panjangnya bisa 2 byte.
Inilah contoh dunia nyata. Untuk kode berikut:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Keluaran pada Debian 7 i686:
sizeof(panjang) =4
Keluaran pada CentOS 7 x64:
sizeof(panjang) =8
Jadi tidak, Anda tidak dapat membuat asumsi tentang ukuran. Jika Anda memerlukan tipe dengan ukuran tertentu, Anda dapat menggunakan tipe yang ditentukan di stdint.h
. Ini mendefinisikan jenis berikut:
int8_t
:ditandatangani 8-bituint8_t
:8-bit yang tidak ditandatanganiint16_t
:ditandatangani 16-bituint16_t
:16-bit yang tidak ditandatanganiint32_t
:ditandatangani 32-bituint32_t
:32-bit tanpa tanda tanganint64_t
:ditandatangani 64-bituint64_t
:64-bit yang tidak ditandatangani
stdint.h
header dijelaskan di bagian 7.20 dari standar, dengan tipe lebar yang tepat di bagian 7.20.1.1. Standar menyatakan bahwa typedef ini opsional, tetapi ada di sebagian besar implementasi.
Tidak, baik standar C maupun POSIX tidak menjamin hal ini dan faktanya sebagian besar platform 64-bit mirip Unix memiliki long
64 bit (8 byte) .