C語言各種數(shù)據(jù)類型的內(nèi)存映像(32位平臺): 
0 signed char
#includeintmain() { charmin=1<<7; ????char?max?=?(1<<7)-1; ????for(int?i=min;i<=max;i++) ????????if(i<0) ????????????printf("%.2X?",(unsigned?char)i); ????????else ????????{ ????????????printf("%c?",i); ????????????if(i%32==0) ????????????????printf(" %d?",i); ????????} ????getchar(); }
output:

1 整型的signed和unsigned
#includeintmain() { 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 }
如果一個表達(dá)式同時(shí)包含signed和unsigned整型,signed會提升為unsgined,可能會隱藏一些意想不到的錯誤,特別是用在比較運(yùn)算時(shí):
unsignedinta=4294967290;
intb=-6;
printf("%d
",a==b);//1,bpromotestounsigned
2 double的二進(jìn)制位顯示
#includevoidprintByte(doubled) { intbs=sizeofd; unsignedchar*ch=(unsignedchar*)&d; for(inti=0;i
將double分成4部分顯示:
#includetypedefstructpacked_double{ unsignedintlow32;//小數(shù)位低32位 unsignedintlow20:20;//小數(shù)位低33-52位 unsignedintexp11:11;//指數(shù)位低53-63位,移碼1023+二進(jìn)制整數(shù)位-1 unsignedintsign:1;//符號位 }packed_double; typedefunion{ doubled; packed_doubleb; }packed; intmain() { packedpd; 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(); return0; } /* 0102610158080 */
3 數(shù)組是相同數(shù)據(jù)類型的依次存儲
數(shù)組名是一個存儲數(shù)據(jù)首元素地址具有常量性質(zhì)的特殊指針,成員是相對于基址的偏移:
#includevoidprintArr(shortarr[],intlen) { for(inti=0;i
4 枚舉只是枚舉可以取值的一些符號常量的一個特殊整型
#includeintmain() { enumNm{LOSS,TIE,WIN}nm;//實(shí)質(zhì)是一個整型,成員只是可能的右值(符號常量)的枚舉 nm=LOSS; printf("%d",nm);//0 nm=TIE; printf("%d",nm);//1 nm=WIN; printf("%d",nm);//2 nm=(enumNm)3; printf("%d",nm);//3 printf(" %d",sizeof(enumNm));//4 getchar(); }
枚舉讓相關(guān)符號常量內(nèi)聚為一組,相對于#define,枚舉對數(shù)據(jù)的描述性更清晰。
5 共用體成員的起始地址相同,共用一塊內(nèi)存空間,值相互覆蓋
#includeintmain() { unionNn{inta;doubleb;}nn;//成員的起始地址相同,值相互覆蓋 nn.a=123;// printf("起始地址:%X,內(nèi)存空間占用:%d ",&nn.a,sizeofnn.a); nn.b=12.3; printf("起始地址:%X,內(nèi)存空間占用:%d ",&nn.a,sizeofnn.b); nn.a=12; printf("起始地址:%X,內(nèi)存空間占用:%d ",&nn.a,sizeofnn.a); getchar(); } /* 起始地址:12FF40,內(nèi)存空間占用:4 起始地址:12FF40,內(nèi)存空間占用:8 起始地址:12FF40,內(nèi)存空間占用:4 */
當(dāng)一些事物具有更多共性,但有少量差異時(shí),可以只用一個內(nèi)嵌一個共用體的結(jié)構(gòu)體來描述:
#include#include #defineMAXPARTS12 structParts{//零件 intcost; charsupplier[12]; charunit[12]; }; structAssembly{//裝配件 intn_parts; struct{ charpartno[12]; shortquan; }parts[MAXPARTS]; }; structInventory{//存貨類型,或是零件,或是裝配件 charpartno[10]; intquan; enum{PART,ASSEMBLY}type;//存貨類型 union{ structPartsparts; structAssemblyassembly; }info; }; intmain() { structInventoryscreen; 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"); structInventoryshell; 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; intcosts; if(shell.type==Inventory::ASSEMBLY) costs=shell.info.assembly.n_parts; printf("%d ",costs);//22 getchar(); return0; }
6 結(jié)構(gòu)體是不同數(shù)據(jù)類型的數(shù)據(jù)依次存儲在一起
結(jié)構(gòu)體各數(shù)據(jù)成員的引用可以通過其內(nèi)存大小和字節(jié)對齊來相對于基址偏移來計(jì)算。結(jié)構(gòu)體通常用于描述某一事物,用其成員來描述該事物的某些關(guān)鍵屬性。讓該事物既可以用結(jié)構(gòu)體變量整體表示,也可以對其成員分別引用來處理該事物的各個屬性。
#includeintmain() { structdemo{chara;shortb;intc;}abc;//成員相對于基址偏移,字節(jié)對齊 abc.b=12; short*p=(short*)((int)&abc+sizeof(short));//模擬編譯器計(jì)算第2個成員的偏移地址 printf("%d%d ",abc.b,*p);//1212 printf("%d ",sizeof(structdemo));//8 getchar(); }
7 位域是對整型數(shù)據(jù)的按位處理
(一次可以處理n個位,1<=n<=整形長度)
位域(全局)二進(jìn)制位顯示:
#includevoidprintBinM(unsignedintn) { for(inti=31;i>=0;i--) printf("%d",(n&1<>i); printf(" "); } structBf{ unsigneda:3; unsignedb:4; unsignedc:5; }bf; intmain() { bf.a=1; bf.b=15; bf.c=3; int*p=(int*)&bf;//505 printf("%d ",*p); printBinM(*p);//00000000000000000000000111111001 getchar(); }
位域(局部)二進(jìn)制位顯示:
#includevoidprintBinM(unsignedintn) { for(inti=31;i>=0;i--) printf("%d",(n&1<>i); printf(" "); } intmain() { structBf{ unsigneda:3; unsignedb:4; unsignedc:5; }bf; bf.a=1; bf.b=15; bf.c=3; int*p=(int*)&bf;//-858996231 printf("%d ",*p); printBinM(*p);//11001100110011001100000111111001 getchar(); } 原文標(biāo)題:C 語言各數(shù)據(jù)類型的內(nèi)存映像
文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:彭靜
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7347瀏覽量
95000 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3229瀏覽量
76493 -
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146099 -
存儲數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
90瀏覽量
14490
原文標(biāo)題:C 語言各數(shù)據(jù)類型的內(nèi)存映像
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于凌羽派的OpenHarmony北向應(yīng)用開發(fā):ArkTS語法-數(shù)據(jù)類型和變量聲明
C語言重點(diǎn)—指針篇
睿遠(yuǎn)研究院丨IO-Link規(guī)范解讀(十五):數(shù)據(jù)類型詳解
C語言主要特點(diǎn)
C語言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作
C語言的編程技巧
C語言自動類型轉(zhuǎn)換
C語言特性
C語言強(qiáng)制類型轉(zhuǎn)換
內(nèi)存與數(shù)據(jù)處理優(yōu)化藝術(shù)
SQL 通用數(shù)據(jù)類型
靈活高效ZBUFF — C內(nèi)存數(shù)據(jù)操作庫:優(yōu)化內(nèi)存管理的利器
《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)
IEC101協(xié)議可以傳輸什么類型的數(shù)據(jù)
詳解Prometheus的數(shù)據(jù)類型
C語言各種數(shù)據(jù)類型的內(nèi)存映像
評論