GNU/Linux >> Belajar Linux >  >> Linux

Bisakah saya menganggap ukuran long int selalu 4 byte?

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 untuk CHAR_BIT dan MB_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-bit
  • uint8_t :8-bit yang tidak ditandatangani
  • int16_t :ditandatangani 16-bit
  • uint16_t :16-bit yang tidak ditandatangani
  • int32_t :ditandatangani 32-bit
  • uint32_t :32-bit tanpa tanda tangan
  • int64_t :ditandatangani 64-bit
  • uint64_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) .


Linux
  1. OpenStack Error – Ukuran kolom indeks terlalu besar. Ukuran kolom maksimum adalah 767 byte [Terpecahkan]

  2. Menemukan Ukuran Sektor Dari Sebuah Partisi?

  3. Mengapa Ls Dan Hexdump Tidak Setuju Tentang Ukuran File?

  1. Dapatkan ukuran database di MySQL

  2. Bagaimana cara menghapus X byte dari akhir file besar tanpa membaca seluruh file?

  3. Bagaimana cara menemukan ukuran tumpukan maksimum?

  1. Mengapa ukuran direktori selalu 4096 byte di unix?

  2. Bisakah saya memperluas ukuran gambar disk berbasis file?

  3. Mengapa saya tidak bisa menggulir di terminal?