SORU
21 HAZİRAN 2012, PERŞEMBE


İnt her bayt (işaretsiz karakter)0, sıfır göstermek için garantili hazır mı?

Bu bir mesele değildirpratik tavsiye(ne detanımsız davranış), ama ne hakkındac-aslında standart (unsigned char)0 değeri bir tamsayı türü bayt dönüm konuda garanti eder.


Soru(s)

Parçacığını aşağıdaki ifade kullanılır-eğer deyimgaranti için değerlendirilecekdoğru?

std::memset (
  reinterpret_cast<char*> (&a), // int a;
  (unsigned char)0,
  sizeof (int)
);

if (a == 0) {
  ...
}

Ve C 11 C99 standardı (bu yazı daha aşağı) alıntılar okuyarak bu C99 açıkça görüyoruzgaranti eder0 Tüm bit tamsayı türü kümesi bu tip değeri 0 temsil edecek.

Yapamam C 11 standart garanti bulun.

  • Böyle bir garantisi var mı?
  • Önceki parçacık sonucu gerçekten uygulama özeldir?


C99 (ISO/IEC 9899:1999)

5.2.1.2/1 Boş karakter

Tüm bitler sıfır ile bir bayt boş bir karakter olarak yorumlanır shift devletten bağımsız. Böyle bir baytın herhangi bir parçası olarak kontrol etmekle diğer belge karakter.

6.2.6.2/1 Tamsayı türleri

Herhangi bir doldurma bit değerleri belirtilmemiş.45)Geçerli bir nerede (non-trap) imzalı tamsayı türü temsil nesnesi işaret biti sıfır ilgili geçerli bir nesne temsilidir imzasız yazın ve aynı değeri temsil eder.

Herhangi bir tamsayı için yazın tüm bitlerin sıfır olduğu nesne temsil edilecektir değer gösterimi türü sıfır.



C 11 (ISO/14882:2011 IEC)

2.3/3 Karakter kümeleri [lex.karakter seti]

Temel yürütme karakter kümesi ve temel yürütme geniş karakter kümesi temel tüm üyeleri içermelidir her kaynak karakter kümesi, artı karakter uyarısı temsil eden kontrol, Geri Al ve başı, artıboş bir karakter(sırasıyla, null karakteri), kimin gösterimitüm sıfır bit vardır.

CEVAP
21 HAZİRAN 2012, PERŞEMBE


C 11

İlgili kısmı olduğunu düşünüyorum

C 11 3.9.1/1

Karakter türleri için nesne temsilinin tüm bitleri katılma değer gösterimi. İşaretsiz karakter türleri için, değeri gösterimi mümkün olan tüm bit desenleri numaraları temsil eder. Bu gereksinimler, diğer türler için geçerli değildir.

3.9.1/7 ile birlikte

İntegral tür temsilleri saf ikili rakam sistemi kullanılarak değerleri belirler.

C11

6.2.6.2 çok açık

İşaretsiz tamsayı türleri imzasız char dışında, nesnenin bit için temsili olarak iki gruba bölünecektir: değer bit ve bit doldurma (gerek yok ikincisi herhangi biri). Eğer N değeri bit varsa, her biraz farklı temsil eder 2 Güç arasında 1 ve 2N−1yani bu tür nesneleri yeteneğine sahip olacaktır temsil eden 2 0 değerleriN − 1saf bir ikili gösterimi kullanarak; bu olacaktır değer gösterimi olarak da bilinir. Herhangi bir doldurma bit değerleri belirtilmemiş.

İşaretli tamsayı türleri için nesne temsili bit üç bölünecektir grup: değer bit, dolgu bitleri ve işaret biti. Herhangi bir doldurma bit olmasına gerek yok; imzalı char herhangi bir doldurma bit olmayacaktır. Tam bir işaret biti olacaktır. Değeri bir bit her bit nesne aynı bit olarak aynı değere sahip olacaktır karşılık gelen imzasız türü (eğer M değeri bit "olmazsa olmaz" imzalı temsili türü ve işaretsiz yazın N, M N, N). Eğer işaret biti sıfırsa, sonuç değeri etkilemeyecektir. Eğer işaret biti bir ise, değer bir değişiklik olacaktır aşağıdaki yolu vardır:

— işareti 0 bit ile ilgili değer (işaret ve büyüklük) etkisiz hale gelir;

— biti değeri −(2M) (iki tamamlayıcı);

— biti değeri −(2M − 1) (olanları’ tamamlayıcı).

Bu uygulama tanımlı olarak tabela değeri olsun bit 1 geçerlidir. ve tüm değeri sıfır (ilk iki), ya da az da olsa değer 1 bit işareti ile (’olanlar tamamlamak için, tuzak bir beyan veya normal bir değer. bit Oturum halinde ve büyüklük ve olanlar’, eğer bu gösterimi normal bir değer denir tamamlayıcı bir negatif sıfır.

Summmary

Her iki standart için aynı niyetinde sanırım.

  • char, signed char unsigned char bit değeri katılacak

  • diğer tamsayı türü olabilirdoldurma bitideğeri katılmayın. Onları yanlış bir bit deseni geçerli bir değer olduğu düşünülebilir.

  • yorumu saf bir ikili gösterimi, yukarıda C11 alıntı genişletilmiş olan bir şey.

Belli değil olabilecek iki şey var

  • -0 (içinişaret ve büyüklükve _ones' tamamlayıcı) C tuzak bir değeri olabilir

  • doldurma biti tek eşlik biti (yani doldurma bitleri değiştirilmiş değil emin olun veya temsil değiştirebilir miyiz) olabilir

Muhafazakar ve evet, her ikisi için de kabul ediyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howcast

    Howcast

    4 EKİM 2007
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • mist64

    mist64

    30 Mayıs 2006