SORU
1 Aralık 2010, ÇARŞAMBA


`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:

  1. 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:

  1. [...] uygulama temel karakter kümesi herhangi bir üye saklamak için yeterince büyük.

1.7/1 daha somut olarak bu tanımlar:

  1. 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.

  1. C Standardı özellikle C öğrenmek için C (1.2/1) bilmeniz gerekir diyor1

  2. 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
1 Aralık 2010, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • Sam Kear

    Sam Kear

    14 Temmuz 2007