c語言位結構體
A. c語言的結構體位定義問題
按照名字定義,u無符號int整形,數字816,表示多少位的整形,
1位元組 uint8_t
2位元組 uint16_t
4位元組 uint32_t
8位元組 uint64_t
詳情參考:http://www.cnblogs.com/baochun968/archive/2011/10/19/2218008.html
bit0:1這句話定義了一個位域,bit0是該位域的域名,而且bit0隻佔用一個位。
位域是指信息在存儲時,並不需要佔用一個完整的位元組,而只需占幾個或一個二進制位。為了節省存儲空間,並使處理簡便,C語言提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
參考:http://..com/question/391684179.html
所以上面的結構體,一個元素屬性佔一位,前面的是2位元組,後面也是兩個位元組。本質上沒有區分吧
常規下可以這樣測試上面的代碼
#include<stdio.h>
typedef unsigned short uint16_t ;
typedef unsigned char uint8_t ;
typedef struct
{
uint16_t bit0:1;
uint16_t bit1:1;
uint16_t bit2:1;
uint16_t bit3:1;
uint16_t bit4:1;
uint16_t bit5:1;
uint16_t bit6:1;
uint16_t bit7:1;
uint16_t bit8:1;
uint16_t bit9:1;
uint16_t bit10:1;
uint16_t bit11:1;
uint16_t bit12:1;
uint16_t bit13:1;
uint16_t bit14:1;
uint16_t bit15:1;
}BITS161;
typedef struct
{
uint8_t bit0:1;
uint8_t bit1:1;
uint8_t bit2:1;
uint8_t bit3:1;
uint8_t bit4:1;
uint8_t bit5:1;
uint8_t bit6:1;
uint8_t bit7:1;
uint8_t bit8:1;
uint8_t bit9:1;
uint8_t bit10:1;
uint8_t bit11:1;
uint8_t bit12:1;
uint8_t bit13:1;
uint8_t bit14:1;
uint8_t bit15:1;
}BITS162;
int main(){
printf("%d,%d",sizeof(BITS161),sizeof(BITS162));
return 0;
}
輸出為2,2,表示結構體都是兩個位元組。但是如果typedefunsignedintuint16_t;就是用通常的4位元組整形表示uint16_t,上面的結構體至少要一個int長度,輸出為4,2
B. 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. C語言的結構體類型是什麼數據數據有哪些類型
結構體類型就是以struct關鍵字定義的數據類型。
結構體(struct)是由一系列具有相同類型或不同類型的數據構成的數據集合,也叫結構。是一種聚合類型,裡面可以包含多種數據類型,甚至可以結構體里嵌套結構體。相信我,等你深入理解了C言語之後,結構體在C語言里是一個神器。
D. C語言中位段結構體移位問題
t,r都是結構變數,C語言規定只能引用結構體成員而不能直接用結構體變數賦值,所以不能這樣.
t=t>>1; //要把t整體移動一位怎麼移,移了過後又是什麼
此結構體最小長度是一個unsigned,如是char 就有8位,int就有16位,而t只佔最右一位,右移一位就是把t值清零.
E. C語言結構體定義
C語言結構體定義:struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。
結構體是C語言中聚合數據類型(aggregatedatatype)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
(5)c語言位結構體擴展閱讀
1、struct是聲明結構體類型時必須使用的關鍵字,不能省略。「結構體」這個詞是根據英文單詞structure譯出的。
2、structSTUDENT是定義的數據類型的名字,它向編譯系統聲明這是一個「結構體類型」,包括name、num、sex、age、score、addr等不同類型的項。
3、structSTUDENT與系統提供的int、char、float、double等標准類型名一樣,都是數據類型,具有同樣的作用,都是用來定義變數的。
F. c語言中如何定義一個結構體
結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,而通常這種指針的應用是為了實現一些更高級的數據結構如鏈表和樹等。如果兩個結構體互相包含,則需要對其中一個結構體進行不完整聲明。
(6)c語言位結構體擴展閱讀:
一、結構體作用:
結構體和其他類型基礎數據類型一樣,例如int類型,char類型,只不過結構體可以做成你想要的數據類型,以方便日後的使用。
在實際項目中,結構體是大量存在的,研發人員常使用結構體來封裝一些屬性來組成新的類型。由於C語言內部程序比較簡單,研發人員通常使用結構體創造新的「屬性」,其目的是簡化運算。
結構體在函數中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什麼,只要根據定義使用就可以了。
二、結構體的大小與內存對齊:
結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit字長的CPU,對這類型的CPU取4個位元組的數要比取一個位元組要高效,也更方便。
所以在結構體中每個成員的首地址都是4的整數倍的話,取數據元素時就會相對更高效,這就是內存對齊的由來。每個特定平台上的編譯器都有自己的默認「對齊系數」(也叫對齊模數)。
程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的「對齊系數」。
三、結構體的規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2可推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
G. C語言結構體Struct怎麼使用
在Turbo C中,結構也是一種數據類型, 可以使用結構變數,因此,像其它類型的變數一樣,在使用結構變數時要先對其定義。
如果需要定義多個具有相同形式的結構變數時用這種方法比較方便,它先作結構說明,再用結構名來定義變數。
(7)c語言位結構體擴展閱讀
指向結構體的指針是一個一直都沒有掌握好的點,希望這里能記錄好一點,加強理解。
對於指針有幾個好處,
第一:就像指向數組的指針比數組本身更容易操作一樣,指向結構的指針通常也更容易操作;
第二:在早期的C中參數傳遞只能使用結構的指針;
第三:很多奇妙的數據表示都是用了包含指向其他結構的指針的結構。
和數組不同,結構的名字不是該結構的地址(即單獨的結構名並不是該結構地址的同義詞),必須使用 & 運算符。
參考資料c語言結構體struct相關使用說明
H. c語言結構體是什麼
C語言結構體(Struct)從本質上講是一種自定義的數據類型,只不過這種數據類型比較復雜,是由 int、char、float 等基本類型組成的。你可以認為結構體是一種聚合類型。
在實際開發中,我們可以將一組類型不同的、但是用來描述同一件事物的變數放到結構體中。例如,在校學生有姓名、年齡、身高、成績等屬性,學了結構體後,我們就不需要再定義多個變數了,將它們都放到結構體中即可。
簡介
關鍵字struct和結構體名組合成一種類型標識符,其地位如同通常的int、char等類型標識符,其用途就像 int 類型標識符標識整型變數一樣可以用來定義結構體變數。
定義變數以後,該變數就可以像定義的其他變數一樣使用了;成員又稱為成員變數,它是結構體所包含的若干個基本的結構類型,必須用「{}」括起來,並且要以分號結束,每個成員應表明具體的數據類型。