`Uzun` en az 32 bit olduğu garanti mi?
C standardının benim okuyarak, her zaman C integral temel türleri ve boyutları aşağıdaki gibi olduğunu anladım:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
3.9.1/2 bu sonuca vardım:
- Dört imzalı tamsayı türü vardır:“”, “short int”,imzalı char “” ve “uzun ınt.” int Bu listede, her yazın en azından kadar sağlar o, önceki gibi depolama liste. Düz in doğal boyutu var bu mimarisi tarafından önerilen çalışma ortamı
Ayrıca, char
boyutu olarak 3.9.1/ tarafından açıklanmıştır:
- [...] uygulama temel karakter kümesi herhangi bir üye saklamak için yeterince büyük.
1.7/1 daha somut olarak bu tanımlar:
- C bellek modeli temel depolama birimi byte. Bir bayt en azından temel yürütme karakter kümesi herhangi bir üye büyüklükte ve sayıda uygulama tanımlı bit bitişik bir dizi oluşur.
Bu şu sonuca götürüyor:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
sizeof
kaç türü olduğunu söyler. Ayrıca, birçok bit bir byte kaç tanımlı uygulama. Çoğumuz muhtemelen 8-bit byte ile ilgili kullanılır, ama Standart bir bayt n
bit olduğunu söylüyor.
Şöyle diyor: this post Alf P. Steinbach
uzun garantili (en az) 32 bittir.
Bu standarda göre C temel tiplerinin boyutunu anlıyorum her şeyi karşısında uçar. Normalde sadece bir acemi yanlış olarak bu deyimi indirim yapardım ama bu Alf olduğundan daha fazla araştırmaya değer olduğuna karar verdi.
, Sen ne diyorsun? Uzun en az 32 bit için standart tarafından güvence altına alınmıştır? Eğer öyleyse, lütfen Bu garanti yapılır nasıl açık olun. Ben öyle düşünmüyorum.
C Standardı özellikle C öğrenmek için C (1.2/1) bilmeniz gerekir diyor1
C Standardı
long
LONG_MIN
-LONG_MAX
olmak ağırlayacak örtük olarak değerleri minimum limiti tanımlar2
long
ne kadar güzel olursa olsun, LONG_MİN LONG_MAX tutmak için yeterince büyük olmalı.
Ama Alf ve diğerleriözelbu uzun en az 32 bit olmalıdır. Bu kurmaya çalışıyorum. C Standart açık sayı bit bir bayt belirtilmemiş (olabilir 4, 8, 16, 42) nasıl bir bağlantı yapılmış olması mümkün karşılamak numaraları LONG_MIN-LONG_MAX
olmak için en az 32 bit mi?
(1) 1.2/1: referans belgeler aşağıdaki Bu belge uygulama için vazgeçilmezdir. Tarihli referanslar için, sadece baskı gösterdi geçerlidir. Tarihsiz referanslar için, başvurulan belgenin son sürümü (herhangi bir değişiklik dahil) geçerlidir.
- ISO/2382 (tüm bölümleri), Bilgi Teknolojisi – Kelime IEC
- ISO/IEC 9899:1999, Programlama dilleri – C
- IEC 10646-1:2000, Bilgi Teknolojisi – Evrensel Birden çok Sekizli Kodlanmış Karakter Kümesi (USC) ISO/ – Bölüm 1: Mimari ve Temel Çokdilli Düzlem
(2) <climits>
olarak Tanımlanmış:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX 2147483647 // 2^31 - 1
CEVAP
C sınırları C standardında tanımlanan kullanımları (C : 18.3.2 (c.sınırları), C: 5.2.4.2.1):
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX 2147483647 // 2^31 - 1
Uzun en az 32 bit olduğu garanti edilir.
Ve eğer 18*/LONG_MAX
*18.3.1.2 bakmak gerekir ** 20, Bir tarafından temsil edilebilir olup olmadığı uzun dolambaçlı yolu takip etmek istiyorsanız (sayısal.sınırlar.üyeleri) C standart:
static constexpr T min() throw(); // Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
static constexpr T max() throw(); // Equivalent to CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, etc.
Tam olarak standart görünen bir şey yok, açıklama dipnotları taşındım. Ama temelde std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN
std::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX
anlamına gelir.
Öyle olsa bile, C standart değil belirtmek bit seviyesinde temsil (imzalı) negatif sayılar, sahip olmak ya da ikişer-tamamlayıcı ve ihtiyaç 32-bit depolama toplam, ya da bir açık işaret biti anlamına gelir vardır 32-bit depolama de.
Char 8-bit tam olarak uzun garanti ver...
Uzun şifreleri karma için nasıl (&; gt...
Nasıl Python bu uzun satırı kadar zara...
Program't libgcc_s_dw2-1.dll eksi...
Git her itmek için uzun parolayı girin...