",cc.xx);
結(jié)果會(huì)是:-1
因?yàn)檫@里定義的xx為int 型,15的二進(jìn)制位1111,最高位為1,表示為負(fù)數(shù),所以取反加1后為0001。所以是-1。
這種位域操作的好處是當(dāng)你不需要用到你定義的類(lèi)型的長(zhǎng)度時(shí),可以加位域操作以節(jié)省內(nèi)存空間。
引出的其他問(wèn)題
這里用sizeof(struct a)得到的是4,如果不加位域限制則是8,至于為什么是4呢?4bit+4bit應(yīng)該剛好是1byte啊,應(yīng)該是1才對(duì)啊。這是因?yàn)槲沂窃趌inux下編譯執(zhí)行的,而在linux對(duì)內(nèi)存分配最小值為類(lèi)型值的一半。(我在linux下做了實(shí)驗(yàn))如下我定義了一個(gè)結(jié)構(gòu)體:
struct a{
short int xx:2;
short int yy:2;
}bb;
如上,我定義二個(gè)short int類(lèi)型值,short int在32位linux下為2字節(jié),這里二個(gè)相加不足一字節(jié),但是輸出sizeof(struct a)的值為2。不足一字節(jié)系統(tǒng)自動(dòng)補(bǔ)滿一字節(jié)。
struct a{
short int xx:9;
short int yy:2;
}bb;
這個(gè)輸出也是2。xx超過(guò)一字節(jié),但是9+2=11,還沒(méi)有超過(guò)16(2字節(jié)),我猜系統(tǒng)將xx超過(guò)的那1bit分到了yy那1bit里面了。
struct a{
short int xx:9;
short int yy:9;
}bb;
這個(gè)輸出是4。9+9=18,超過(guò)了16,系統(tǒng)各分配了2字節(jié)給xx和yy。