C'deki bir Tamsayı değişkeni 2 bayt mı yoksa 4 bayt mı?
Bu, kullandığınız platforma ve derleyicinizin nasıl yapılandırıldığına bağlıdır. Tek yetkili cevap, sizeof
özel durumunuzda bir tam sayının ne kadar büyük olduğunu görmek için operatörü kullanmaktır .
Bağlı olduğu faktörler nelerdir?
Aralık , boyuttan ziyade en iyi şekilde düşünülebilir . Her ikisi de pratikte farklılık gösterecektir, ancak değişken türleri aralığa göre göreceğimiz kadar büyüklükte seçmek çok daha aptalca dayanıklıdır. Standardın bizi tamsayı türlerimizi boyuttan ziyade aralığa göre seçmeye teşvik ettiğine dikkat etmek de önemlidir , ancak şimdilik standart uygulamayı görmezden gelelim ve merakımızın , baytları ve tamsayı temsilini keşfetmesine izin verelim ... tavşan deliği ve kendimiz görün ...sizeof
CHAR_BIT
sizeof
, bayt ve CHAR_BIT
C standardından alınan (yukarıdaki ile bağlantılı) aşağıdaki ifade, bunu geliştirilebileceğini düşünmediğim kelimelerle açıklamaktadır.
sizeof
Operatör bir ekspresyon ya da bir tür parantez içinde adı olabilir onun işlenen (bayt) boyutu, elde edilir. Boyut, işlenen türünden belirlenir.
Açık bir anlayış varsaymak bizi bayt hakkında bir tartışmaya götürecektir . Genellikle bir baytın sekiz bit olduğu varsayılır, gerçekte CHAR_BIT
size bir baytta kaç bit olduğunu söyler . Bu , ortak iki (veya dört) bayt tamsayı hakkında konuşurken dikkate alınmayan nüanslardan sadece bir diğeri .
Şimdiye kadar işleri tamamlayalım:
sizeof
=> bayt cinsinden boyut ve
CHAR_BIT
=> bayttaki bit sayısı
Böylece, sisteminize bağlı olarak, sıfırdan büyük herhangi bir değer sizeof (unsigned int)
olabilir (sadece 2 veya 4 değil), 16 gibi, o zaman tek bir (onaltı bit) bir bayt , standartları (aşağıda alıntılanmıştır). Bu her zaman yararlı bir bilgi değil, değil mi? Daha derine inelim ...CHAR_BIT
Tamsayı gösterimi
C standardı CHAR_BIT
, burada tüm standart tamsayı türleri (ve de fwiw) için minimum hassasiyeti / aralığı belirtir . Bundan , değeri saklamak için kaç bitin gerekli olduğu için bir minimum türetebiliriz , ancak değişkenlerimizi aralıklara göre seçebiliriz . Bununla birlikte, bu cevap için gereken detayların büyük bir kısmı burada bulunmaktadır. Örneğin, standardın (en az) on altı bit depolama alanı gerektirmesi:unsigned int
UINT_MAX 65535 // 2¹⁶ - 1
Bu nedenle unsigned int
( en azından ) 16 bit gerektirdiğini görebiliriz , bu da iki baytı aldığınız yerdir ( CHAR_BIT
8 olduğu varsayılır ) ... ve daha sonra bu sınır arttığında 2³² - 1
, insanlar bunun yerine 4 bayt belirtiyordu . Bu, gözlemlediğiniz fenomenleri açıklar:
Ders kitaplarının çoğu tamsayı değişkenlerinin 2 bayt içerdiğini söylüyor. Ama bir tamsayılar dizisinin birbirini izleyen adreslerini yazdıran bir program çalıştırdığımda 4 farkını gösteriyor.
Taşınabilir olmayan C'yi öğreten eski bir ders kitabı ve derleyici kullanıyorsunuz; ders kitabınızı yazan yazar farkında bile olmayabilir CHAR_BIT
. Sen olmalıdır için ders kitabı (ve derleyici) yükseltme ve BT sürekli gelişen bir alan kalmak gerektiğini olduğunu hatırlamak için çaba öncesinde rekabet ettiğini ... olsa Yeter bu konuda hiç; Bakalım tamsayı baytlarının sakladığı diğer taşınabilir olmayan sırlar ne ...
Değer bitleri , yaygın yanılgıların dikkate alındığı şeydir. Yukarıdaki örnek, unsigned
tipik olarak yalnızca değer bitleri içeren bir tamsayı türü kullanır , bu nedenle ayrıntıdaki şeytanı kaçırmak kolaydır.
İşaret bitleri ... Yukarıdaki örnekte UINT_MAX
, üst sınır olarak alıntı yaptığımdan unsigned int
, değeri 16
yorumdan çıkarmak önemsiz bir örnektir . İmzalı türler için, pozitif ve negatif değerleri (bu işarettir) ayırt etmek için işaret bitini de eklememiz gerekir.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Doldurma bitleri ... Tamsayılarda doldurma bitlerine sahip bilgisayarlarla karşılaşmak yaygın olmasa da, C standardı buna izin verir; bazı makineler (yani bu ), iki küçük (işaretli) tamsayı değerini bir araya getirerek daha büyük tamsayı türleri uygular ... ve işaretli tamsayıları birleştirdiğinizde, boşa giden bir işaret biti elde edersiniz. Boşa harcanan bit, C'de dolgu olarak kabul edilir . Diğer dolgu bitlerine örnek olarak parite bitleri ve tuzak bitleri verilebilir .
Gördüğünüz gibi, standart gibi aralıklarını göz önünde bulundurarak teşvik görünüyor INT_MIN
.. INT_MAX
ve diğer asgari / standardından maksimum değerler tamsayı tiplerini seçme ve zorlaştırır, muhtemelen gibi unutulmaya diğer ince faktör bulunmaktadır boyutlarda güvenerek CHAR_BIT
ve dolgu bitleri hangi değerini etkileyebilir sizeof (int)
(yani, iki bayt ve dört bayt tamsayıların yaygın yanılgıları bu ayrıntıları ihmal eder).