嵌入式 C 語言各種數據類型的內存映像(32位平臺),如下圖所示。
1 - signed char
#includeintmain() { charmin=1<<7; ????char?max?=?(1<<7)-1;??? for(int i=min;i<=max;i++) if(i<0)printf("%.2X?",(unsignedchar)i); else{ ????printf("%c?",i); ????if(i%32==0) ????printf(" %d?",i); } getchar(); }
output :
2 - 整型的signed和unsigned
#includeint main() { signedintsmin=1<<31; ????signed?int?smax?=?(1<<31)-1; printf("%d ",smin); // -2147483648 printf("%d ",smax); // 2147483647 unsigned int umax = -1; printf("%u ",umax); // 4294967295 umax = (1<<32)-1; printf("%u ",umax); // 4294967295 }
如果一個表達式同時包含signed和unsigned整型,signed會提升為unsgined,可能會隱藏一些意想不到的錯誤,特別是用在比較運算時:
unsigned int a=4294967290; int b=-6; printf("%d ",a==b);//1,bpromotestounsigned
3 - double的二進制位顯示
#includevoid printByte(double d) { intbs=sizeofd; unsignedchar*ch=(unsignedchar*)&d; for(inti=0;i 將double分成4部分顯示:
#include
typedefstructpacked_double{ unsigned int low32; // 小數位 低32位 unsigned int low20:20; // 小數位 低33-52位 unsigned int exp11:11; // 指數位 低53-63位,移碼1023+二進制整數位-1 unsigned int sign:1; // 符號位} packed_double;typedef union { double d; packed_double b; } packed; int main() { packed pd; pd.d = -15.75; pd.d = 12.3; printf("%u %u %u %u ",pd.b.sign,pd.b.exp11,pd.b.low20,pd.b.low32); getchar(); return 0; }/* 0 1026 1015808 0 */ 0 1026 1015808 0 */4 - 數組是相同數據類型的依次存儲
數組名是一個存儲數據首元素地址具有常量性質的特殊指針,成員是相對于基址的偏移:
#includevoid printArr(short arr[],int len) { for(inti=0;i 5 - 枚舉只是枚舉可以取值的一些符號常量的一個特殊整型
#includeint main() { enum Nm{LOSS,TIE,WIN}nm; // 實質是一個整型,成員只是可能的右值(符號常量)的枚舉 nm = LOSS; printf("%d ",nm); // 0 nm = TIE; printf("%d ",nm); // 1 nm = WIN; printf("%d ",nm); // 2 nm = (enum Nm)3; printf("%d ",nm); // 3 printf(" %d",sizeof(enum Nm)); // 4 getchar(); } 枚舉讓相關符號常量內聚為一組,相對于#define,枚舉對數據的描述性更清晰。
6 - 共用體成員的起始地址相同,共用一塊內存空間,值相互覆蓋
#includeint main() { union Nn{int a; double b;}nn;// 成員的起始地址相同,值相互覆蓋 nn.a = 123; // printf("起始地址:%X,內存空間占用:%d ",&nn.a,sizeof nn.a); nn.b = 12.3; printf("起始地址:%X,內存空間占用:%d ",&nn.a,sizeof nn.b); nn.a = 12; printf("起始地址:%X,內存空間占用:%d ",&nn.a,sizeof nn.a); getchar(); }/* 起始地址:12FF40,內存空間占用:4 起始地址:12FF40,內存空間占用:8 起始地址:12FF40,內存空間占用:4 */ 當一些事物具有更多共性,但有少量差異時,可以只用一個內嵌一個共用體的結構體來描述:
#include#include #define MAXPARTS 12 structParts { // 零件 int cost; char supplier[12]; char unit[12] ; }; structAssembly { // 裝配件 int n_parts; struct { char partno[12]; short quan; }parts[MAXPARTS]; }; structInventory {//存貨類型,或是零件,或是裝配件 char partno[10]; int quan; enum{PART,ASSEMBLY}type; // 存貨類型 union { struct Parts parts; struct Assembly assembly; }info; }; intmain() { struct Inventory screen; strcpy(screen.partno,"p001"); screen.quan = 12; screen.type = Inventory::PART; screen.info.parts.cost = 122; strcpy(screen.info.parts.supplier,"hw"); strcpy(screen.info.parts.unit,"pcs"); struct Inventory shell; strcpy(shell.partno,"a001"); shell.quan = 4; shell.type = Inventory::ASSEMBLY; shell.info.assembly.n_parts=22; strcpy(shell.info.assembly.parts[0].partno,"d001"); shell.info.assembly.parts[1].quan = 5; int costs; if(shell.type == Inventory::ASSEMBLY) costs = shell.info.assembly.n_parts; printf("%d ",costs); //22 getchar(); return 0; } 7 - 結構體是不同數據類型的數據依次存儲在一起
結構體各數據成員的引用可以通過其內存大小和字節對齊來相對于基址偏移來計算。結構體通常用于描述某一事物,用其成員來描述該事物的某些關鍵屬性。讓該事物既可以用結構體變量整體表示,也可以對其成員分別引用來處理該事物的各個屬性。
#includeint main() { structdemo { chara; shortb; intc; } abc; // 成員相對于基址偏移,字節對齊 abc.b=12; short*p=(short*)((int)&abc+sizeof(short));//模擬編譯器計算第2個成員的偏移地址 printf("%d %d ",abc.b,*p); // 12 12 printf("%d ",sizeof(struct demo));// 8 getchar(); } 8 - 位域是對整型數據的按位處理
(一次可以處理n個位,1<=n<=整形長度),位域(全局)二進制位顯示:
#includevoidprintBinM(unsignedintn) { for(inti=31;i>=0;i--) printf("%d",(n&1<>i); printf(" "); } structBf{ unsigned a:3; unsigned b:4; unsigned c:5; }bf; intmain() { bf.a =1; bf.b=15; bf.c=3; int *p = (int*)&bf; // 505 printf("%d ",*p); printBinM(*p);//00000000000000000000000111111001 getchar(); } 位域(局部)二進制位顯示:
#include審核編輯:黃飛voidprintBinM(unsignedintn) { for(inti=31;i>=0;i--) printf("%d",(n & 1<>i); printf(" "); } intmain(){ structBf{ unsigned a:3; unsigned b:4; unsigned c:5; }bf; bf.a =1; bf.b=15; bf.c=3; int *p = (int*)&bf; // -858996231 printf("%d ",*p); printBinM(*p);//11001100110011001100000111111001 getchar(); }
-
嵌入式
+關注
關注
5087文章
19153瀏覽量
306428 -
C語言
+關注
關注
180文章
7613瀏覽量
137247 -
數據類型
+關注
關注
0文章
236瀏覽量
13638
原文標題:嵌入式 C 語言,各種數據類型的內存映像
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論