當前位置:首頁 » 編程語言 » c語言中的位結構
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中的位結構

發布時間: 2022-09-10 06:28:45

c語言是怎樣實現位段的

C語言提供了位域。
摘自<譚書>
位域

有些信息在存儲時,並不需要佔用一個完整的位元組, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變數,共占兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:

1. 一個位域必須存儲在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a占第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。

2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。

3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。

二、位域的使用位域的使用和結構成員的使用相同,其一般形式為: 位域變數名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上常式序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變數bit和指向bs類型的指針變數pbit。這表示位域也是可以使用指針的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指針變數pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"|=", 相當於: pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。

㈡ C語言變數定義

這個表示的是位域,表示變數所佔得位數位結構是c51語言中的一種特殊結構,可以用於訪問一個位元組或字的多個位。位結構一般形式如下。
struct
位結構名
{
數據類型
變數名:
整形常數;
數據類型
變數名:
整形常數;
}位結構變數;
其中,struct為關鍵字,位結構數據類型必須是整型int(unsigned或signed);整形常熟必須是非負的整數,范圍是0~15,用於表示有多少位,即表示二進制位的個數,變數名是可選項,可以省略。位結構的定義,實例如下。
struct
{
unsigned
lbit
:
8;
//lbit
佔用低位元組0~7共八位。
unsigned
hbit0
:
4;
//hbit0
佔用高位元組0~3共4位。
unsigned
hbit1
:
3;
//hbit1
佔用高位元組4~6共3位。
unsigned
hbit2
:
1;
//hbit2
佔用高位元組第7位。
}bit;
位結構成員的訪問與結構成員的訪問相同,例如訪問上列位結構中的lbit成員可寫成如下形式
bit.lbit
在使用位結構時,應注意以下幾點。
1、位結構中的成員必須是int,但可以定義為unsigned或者signed。
2、當位結構成員長度為1時,c51語言將其認為是unsigned類型。
3、位結構總長度(位數)是各個位成員定義的位數之和,可以超過兩個位元組。
4、位結構中的成員不能使用數組和指針,但位結構變數可以是數組和指針。如果是指針,其成員訪問方式同結構指針。
5、位結構可以成為嵌套式結構的成員,與其他結構成員一起使用,示例如下。
struct
student
{
char
*name;
int
num;
int
age;
char
*sex;
float
score;
unsigned
reister:1;
unsigned
pay:1;
};

㈢ c語言的bit類型

C語言中bit類型是「位」數據類型,一般在嵌入式軟體中應用較多,用於IO口的控制,可以是單獨申明位變數,也可以申請位結構數據類型,比如:

structst_flash{/*structFLASH*/

union{/*FLMCR1*/

unsignedcharBYTE;/*ByteAccess*/

struct{/*BitAccess*/

unsignedcharFWE:1;/*FWE*/

unsignedcharSWE1:1;/*SWE1*/

unsignedcharESU1:1;/*ESU1*/

unsignedcharPSU1:1;/*PSU1*/

unsignedcharEV1:1;/*EV1*/

unsignedcharPV1:1;/*PV1*/

unsignedcharE1:1;/*E1*/

unsignedcharP1:1;/*P1*/

}BIT;

}FLMCR1;

union{/*FLMCR2*/

unsignedcharBYTE;/*ByteAccess*/

struct{/*BitAccess*/

unsignedcharFLER:1;/*FLER*/

unsignedcharSWE2:1;/*SWE2*/

unsignedcharESU2:1;/*ESU2*/

unsignedcharPSU2:1;/*PSU2*/

unsignedcharEV2:1;/*EV2*/

unsignedcharPV2:1;/*PV2*/

unsignedcharE2:1;/*E2*/

unsignedcharP2:1;/*P2*/

}BIT;

}FLMCR2;

union{/*EBR1*/

unsignedcharBYTE;/*ByteAccess*/

struct{/*BitAccess*/

unsignedcharEB7:1;/*EB7*/

unsignedcharEB6:1;/*EB6*/

unsignedcharEB5:1;/*EB5*/

unsignedcharEB4:1;/*EB4*/

unsignedcharEB3:1;/*EB3*/

unsignedcharEB2:1;/*EB2*/

unsignedcharEB1:1;/*EB1*/

unsignedcharEB0:1;/*EB0*/

}BIT;

}EBR1;

union{/*EBR2*/

unsignedcharBYTE;/*ByteAccess*/

struct{/*BitAccess*/

unsignedcharEB15:1;/*EB15*/

unsignedcharEB14:1;/*EB14*/

unsignedcharEB13:1;/*EB13*/

unsignedcharEB12:1;/*EB12*/

unsignedcharEB11:1;/*EB11*/

unsignedcharEB10:1;/*EB10*/

unsignedcharEB9:1;/*EB9*/

unsignedcharEB8:1;/*EB8*/

}BIT;

}EBR2;

};

㈣ C語言中位段結構體移位問題

t,r都是結構變數,C語言規定只能引用結構體成員而不能直接用結構體變數賦值,所以不能這樣.
t=t>>1; //要把t整體移動一位怎麼移,移了過後又是什麼
此結構體最小長度是一個unsigned,如是char 就有8位,int就有16位,而t只佔最右一位,右移一位就是把t值清零.

㈤ C語言中如何將16位結構體定義為4位和12位兩部分

沒法定義,只是在使用的時候可以實現4位與12位的效果。可以將A與B分別定義成16位的,按兩個成員來用。或定義成一個16位成員,然後在讀、寫時分別處理高四位與低12位。

㈥ C語言什麼是位段,位段的定義求答案

位段(bit-field)是以位為單位來定義結構體(或聯合體)中的成員變數所佔的空間。含有位段的結構體(聯合體)稱為位段結構。採用位段結構既能夠節省空間,又方便於操作。

位段的定義格式為:

type [var]:digits

其中type只能為int,unsigned int,signed int三種類型(int型能不能表示負數視編譯器而定)。位段名稱var是可選參數,即可以省略。digits表示該位段所佔的二進制位數。

那麼定義一個位段結構可以像下面這段代碼去定義:

structnode
{
unsignedinta:4;//位段a,佔4位
unsignedint:0;//無名位段,佔0位
unsignedintb:4;//位段b,佔4位
intc:32;//位段c,佔32位
int:6;//無名位段,佔6位
};

使用位段需注意一下幾點:

1)位段的類型只能是int,unsigned int,signed int三種類型,不能是char型或者浮點型;

2)位段占的二進制位數不能超過該基本類型所能表示的最大位數,比如在VC中int是佔4個位元組,那麼最多隻能是32位;

3)無名位段不能被訪問,但是會占據空間;

4)不能對位段進行取地址操作;

5)若位段占的二進制位數為0,則這個位段必須是無名位段,下一個位段從下一個位段存儲單元(這里的位段存儲單元經測試在VC環境下是4個位元組)開始存放;

6)若位段出現在表達式中,則會自動進行整型升級,自動轉換為int型或者unsigned int。

7)對位段賦值時,最好不要超過位段所能表示的最大范圍,否則可能會造成意想不到的結果。

8)位段不能出現數組的形式。

㈦ c語言中位段和結構體

由右至左指的是位在一個unsigned里的存儲位置,如果這里的unsigned是16位

那麼a占低2位,b占低3位,c占低4位

高 ——> 低
|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|

所以data.a = 8,由於a只佔2位,最大能保存3,所以溢出,data.a = 0,最後結果是輸出2

㈧ C語言中的位欄位結構

因為你定義的位欄位只能有兩位二進制位

3的二進制是11
4的二進制是100

所以賦值4的話就會超出一位,出錯

㈨ C語言的結構體位定義問題

1.我認為uint16_t這是你定義的一個新類型
typedef unsigned short uint16_t; /*就是定義無符號短整型為 uint16_t*/
typedef unsigned char uint8_y; /*定義無符號char型為 uint8_t*/
兩個結構體中只有這地方不同,對於第二個結構提,因為char型,只有8位,當超過8bit時,會自動的申請新的位元組進行存儲,因此第二個位元組使用2個1位元組存儲,而第一個結構體使用1個2位元組存儲。

2.對於冒號,這是C語言中位域的用法,有些信息在存儲時,並不需要佔用一個完整的位元組, 而只需占幾個或一個二進制位。
例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示
具體例子如下:
#include <stdio.h>

typedef unsigned char u8;

/*定義新類型,這個新類型由4部分組成,每部分只佔無符號char型8bit
中的幾bit*/
typedef struct _my_bit_
{
u8 one:1;
u8 two:2;
u8 three:3;
u8 four:2;
}mybitfiled;

int main()
{
mybitfiled mybit;
/*注意位域分配的位個數,例如one只分配了1bit,那麼mybit.one只能為1或0,
如果輸入2的話,那麼會提示將多餘部分給刪掉的,意思只能取最後1bit的信息*/

mybit.one = 1;
mybit.two = 2;
mybit.three = 3;
mybit.four = 1;
printf("sizeof(mybit) = %d,%d %d %d %d\n",sizeof(mybit),mybit.one,mybit.two,mybit.three,mybit.four);

return 0;
}

㈩ C語言中,如何讀取位結構體中的bit位的偏移量和bit數

2812里的寄存器都是這么設置成共用體的吧,你是結構體和共用體的引用沒有學明白,可以看看C語言書本上關於這部份的內容。可以直接定義每個位,比如UNINPUTS.bit2.bCurrent
=5,那麼對應的那3個位就變成了101