2016-04-01 15 views
2
#include<stdio.h> 
int main() 
{ 
    struct byte 
    { 
     int one:1; 
    }; 

    struct byte var = {1}; // statement A 
    printf("%d", var.one); 
    return 0; 
} 

Burada, "tam" değişkeninin bit belleğini yalnızca 1 ile sınırlı tuttuğumuz; Sadece 0 ve 1'i depolayabilir ve 'deyim A'da' bu değişkeni '1' ile başlatmıştık, '' bir '' kadar iyi olmalıydı ve hala hafızasında bir miktar tutabilir ancak konsolda -1 yazdı! Herhangi bir yardım ?Neden bu kod için -1 yazıyorsa, bit alanı 1 olarak ayarlandığında 1 olması gerekiyordu?

+0

Sorununuzu çözdüyse, kabul edilen bir cevabı (yeşil onay işaretine tıklayarak) işaretlemeyi düşünün. –

cevap

7

O olduğu uygulama tanımlı tür int ile tanımlanan bir bit alanı signed int veya unsigned int eşdeğer olup olmadığını. (Bu yalnızca biraz alanları için geçerlidir, aksi takdirde int tam signed int aynıdır.) (Sizin uygulanmasında olmak göründüğü gibi) int one:1; imzalanır

verirse, söz konusu tek biti işaret bitidir ve olası tek değerler 0 ve -1'dur. Aralık dışı olduğu için, onu başlatmak için kullandığınız 1 değeri,dönüştürülmüş -1'a dönüştürülür. bildiri

Değişim (. Aslında dönüştürme sonucu uygulama tanımlı olan)

unsigned int one:1; 

ve bu değerleri 0 ve 1 sahip olabilir. Gerçekten imzalanmaya ihtiyaç duymadıkça, bit alanları genellikle imzasız olarak işaretlenmelidir - ve bu durumda int yerine signed int kullanmalısınız.

+0

Yani bir taşma hatası mı? Int'in menzilinin daha büyük bir değeri alacağını düşündüm (C ile ilgili neredeyse hiçbir şey söylememeliyim ve bu soruyu merak ediyorum) –

+0

'int'; aralığı en az -32767 ila +32767'dir. Fakat 1 bitlik bir alan sadece iki değerden birini tutabilir ve eğer imzalanırsa o zaman bu değerler -1 ve 0'dır. (2'nin tamamlayıcısını varsayarsak; aksi halde sadece 0 've belki de -0'unu tutabiliriz.) –

+0

Sanırım kafa karıştırıcı, int'den biti dönüşümün gerçekleştiği yerdir. –