From: dscott AT networkusa DOT net (SCOTT19U.ZIP_GUY) Newsgroups: comp.os.msdos.djgpp Subject: Re: Somebody please explain : Length of bit fields Date: Wed, 22 Dec 1999 18:12:22 GMT Organization: Retired Electronic Engineer and Y2K expert Lines: 105 Message-ID: <83r0pm$2ddu$1@news.gate.net> References: <83p1rp$oiu$1 AT newsg3 DOT svr DOT pol DOT co DOT uk> NNTP-Posting-Host: ppp-76.elpasonet.net X-Trace: news.gate.net 945882742 79294 216.84.6.105 (22 Dec 1999 17:12:22 GMT) X-Complaints-To: abuse AT gate DOT net NNTP-Posting-Date: 22 Dec 1999 17:12:22 GMT X-Newsreader: News Xpress 2.01 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com In article <83p1rp$oiu$1 AT newsg3 DOT svr DOT pol DOT co DOT uk>, "Mike Collins" wrote: >Folks, > >I came across an interesting thing: In the program below, I would have >expected a structure length of 6 bytes, but in fact, when I compile it and >single step it, I read the values for a, b, c, d printed below. Of >particular interest is the value of a ( the sizeof the entire structure) = >8. > > >#include > >struct CATALOG >{ unsigned unit:8, // 4 bytes > category:8, > refresh :1; > short num; // 2 bytes >}; > > >main() >{ int a, b, c, d, e; > struct CATALOG ctg; > a = sizeof ctg; > b = sizeof(ctg.num); > c = sizeof(ctg.unit); > d = sizeof(ctg.category); >// e = sizeof(ctg.refresh); // DJGPP doesn't like sizeof(a_bit_field); >} > > a: 8 > b: 2 > c: 4 > d: 4 > >If I move the short in front of the unsigned to change the word boundaries, >like this : > >struct CATALOG >{ short num; > unsigned unit:8, > category:8, > refresh :1; >}; > >.... I still get exactly the same results. > >If I now reduce the length of catalog.category to a bit field of 7, and >remove the line that reads >"d = ... " (because DJGPP doesn't like sizeof(a_bit_field)) >I get the results printed below. > >struct CATALOG >{ short num; > unsigned unit:8, > category:7, > refresh :1; >}; > > a: 4 > b: 2 > c: 4 > >Why does the length of the structure change? The length of all bit fields in >a single unsigned integer should always be 4 bytes (sizeof(unsigned) == 4) >as long as the total number of bits declared is less than 32. > >Again, putting the "short num" at the head of the structure or at its tail >makes no difference to the results. >Another thing that interests me is that sizeof(a_bit_field) compiles ok if >the bit field is 8 bits long, but if it is a fraction of a byte, the compile >throws up an error. > >Your learned opinions will be most appreciated. Bit fields are very fun to play with. I have had trouble getting them to do what I want. I have a progrom that works on packed data of 19 bits and it casued a lot of pain to get the complier to do what I wanted. If you want to see a working example of code using DJGPP C that uses bit fields all over the place look at more source code for scott19u.zip its free the source code is included. David A. Scott -- SCOTT19U.ZIP NOW AVAILABLE WORLD WIDE http://www.jim.com/jamesd/Kong/scott19u.zip Scott famous encryption website NOT FOR WIMPS http://members.xoom.com/ecil/index.htm Scott rejected paper for the ACM http://members.xoom.com/ecil/dspaper.htm Scott famous Compression Page WIMPS allowed http://members.xoom.com/ecil/compress.htm **NOTE EMAIL address is for SPAMERS*** I leave you with this final thought from President Bill Clinton: "The road to tyranny, we must never forget, begins with the destruction of the truth."