Apakah ada mesin (atau kompiler), di mana sizeof(char) != 1
?
Apakah standar C99 mengatakan bahwa sizeof(char)
pada penerapan kepatuhan standar HARUS tepat 1? Jika ya, tolong beri saya nomor bagian dan kutipan.
Pembaruan:
Jika saya memiliki mesin (CPU), yang tidak dapat menangani byte (pembacaan minimal adalah 4 byte, selaras), tetapi hanya 4-s dari byte ( uint32_t
), dapatkah kompiler untuk mesin ini mendefinisikan sizeof(char)
ke 4? sizeof(char)
akan menjadi 1, tetapi char akan memiliki 32 bit ( CHAR_BIT
makro)
Pembaruan2: Tapi sizeof hasil BUKANLAH BYTES! itu adalah ukuran CHAR. Dan char bisa 2 byte, atau (mungkin) 7 bit?
Pembaruan3:
Ok. Semua mesin punya sizeof(char) == 1
. Tapi mesin apa yang dimiliki CHAR_BIT > 8
?
char
(bukanwchar
.) Bahkan jika standar mengatakan itusizeof(char)
harus 1, saya tidak akan mengandalkan asumsi itu.sizeof(char)
selalu 1, meskipun char adalah 32-bit (seperti yang terjadi pada beberapa sistem). C memiliki banyak kutil yang menyenangkan.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
pada mereka; Saya tidak ingatsizeof(int) == sizeof(long)
apakah CHAR_BIT berusia 32 atau 64; Saya berharap itu 32, dan saya pikirsizeof(long) == 1
juga. (Anda dapat menemukan referensi ke, tetapi tidak akses online ke, manual Cray C ).Jawaban:
Itu selalu satu di C99, bagian 6.5.3.4:
Sunting: bukan bagian dari pertanyaan Anda, tetapi untuk minat dari Harbison and Steele, edisi ke-3. (pra c99) hal. 148:
Sunting: Sebagai jawaban atas pertanyaan Anda yang diperbarui, pertanyaan dan jawaban berikut dari Harbison dan Steele relevan (ibid, Keluaran 4 dari Bab 6):
Jawaban (ibid, hlm. 382):
Meskipun ini tidak secara khusus menangani kasus di mana, katakanlah byte adalah 8 bit dan
char
4 dari byte tersebut (sebenarnya tidak mungkin dengan definisi c99, lihat di bawah), fakta bahwasizeof(char) = 1
selalu jelas dari standar c99 dan Harbison dan Steele.Edit: Sebenarnya (ini adalah jawaban terhadap pertanyaan Anda upd 2), sejauh c99 yang bersangkutan
sizeof(char)
adalah dalam byte, dari bagian 6.5.3.4 lagi:jadi dikombinasikan dengan kutipan di atas, byte dari 8 bit dan
char
sebagai 4 dari byte tersebut tidak mungkin: untuk c99 satu byte sama dengan achar
.Sebagai jawaban atas penyebutan kemungkinan 7 bit
char
: ini tidak mungkin dilakukan di c99. Menurut bagian 5.2.4.2.1 dari standar, minimum adalah 8:Nilai-nilai yang ditetapkan implementasinya harus sama atau lebih besar [penekanan saya] dalam besarannya dengan yang ditunjukkan, dengan tanda yang sama.
- jumlah bit untuk objek terkecil yang bukan bit-field (byte)
**CHAR_BIT 8**
- nilai minimum untuk objek bertipe karakter bertanda
**SCHAR_MIN -127//−(27−1)**
- nilai maksimum untuk objek bertipe karakter bertanda
**SCHAR_MAX +127//27−1**
- nilai maksimum untuk objek bertipe unsigned char
**UCHAR_MAX 255//28−1**
- nilai minimum untuk objek bertipe char
- nilai maksimum untuk objek bertipe char
[...]
sumber
sizeof(char)
: ini adalah item lain untuk diperdebatkan / diperiksa / etc. dalam konvensi / standar / pedoman pengkodean Anda, membuang-buang waktu saya bertanya-tanya apakah Anda benar-benar tahu C dan apa lagi yang mungkin salah, membutuhkan "bandwidth" visual / mental / teks-line.Tidak ada mesin
sizeof(char)
yang 4. Selalu 1 byte. Byte itu mungkin berisi 32 bit, tetapi sejauh menyangkut compiler C, itu adalah satu byte. Untuk lebih jelasnya, saya sebenarnya akan mengarahkan Anda ke C ++ FAQ 26.6 . Tautan itu mencakupnya dengan cukup baik dan saya cukup yakin C ++ mendapatkan semua aturan itu dari C. Anda juga dapat melihat comp.lang.c FAQ 8.10 untuk karakter yang lebih besar dari 8 bit.Ya, ini adalah byte. Biarkan saya katakan sekali lagi.
sizeof(char)
adalah 1 byte menurut kompiler C. Apa yang disebut orang sehari-hari sebagai byte (8 bit) belum tentu sama dengan apa yang disebut oleh kompilator C sebagai byte. Jumlah bit dalam C byte bervariasi tergantung pada arsitektur mesin Anda. Ini juga dijamin setidaknya 8.sumber
PDP-10
dan PDP-11adalah.Pembaruan:
tidak ada kompiler C99 untuk PDP-10.Beberapa model Perangkat Analog SHARC DSP 32-bit memiliki CHAR_BIT = 32, dan Texas Instruments DSP dari TMS32F28xx memiliki CHAR_BIT = 16, dilaporkan .
Update: Ada GCC 3.2 untuk PDP-10 dengan CHAR_BIT = 9 (periksa include / limit.h di arsip itu).
sumber