C语言各种数据类型的内存映像(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 }
如果一个表达式同时包含signed和unsigned整型,signed会提升为unsgined,可能会隐藏一些意想不到的错误,特别是用在比较运算时:
unsignedinta=4294967290; intb=-6; printf("%d ",a==b);//1,bpromotestounsigned
2 double的二进制位显示
#includevoidprintByte(doubled) { intbs=sizeofd; unsignedchar*ch=(unsignedchar*)&d; for(inti=0;i
将double分成4部分显示:
#includetypedefstructpacked_double{ unsignedintlow32;//小数位低32位 unsignedintlow20:20;//小数位低33-52位 unsignedintexp11:11;//指数位低53-63位,移码1023+二进制整数位-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 数组是相同数据类型的依次存储
数组名是一个存储数据首元素地址具有常量性质的特殊指针,成员是相对于基址的偏移:
#includevoidprintArr(shortarr[],intlen) { for(inti=0;i
4 枚举只是枚举可以取值的一些符号常量的一个特殊整型
#includeintmain() { enumNm{LOSS,TIE,WIN}nm;//实质是一个整型,成员只是可能的右值(符号常量)的枚举 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(); }
枚举让相关符号常量内聚为一组,相对于#define,枚举对数据的描述性更清晰。
5 共用体成员的起始地址相同,共用一块内存空间,值相互覆盖
#includeintmain() { unionNn{inta;doubleb;}nn;//成员的起始地址相同,值相互覆盖 nn.a=123;// printf("起始地址:%X,内存空间占用:%d ",&nn.a,sizeofnn.a); nn.b=12.3; printf("起始地址:%X,内存空间占用:%d ",&nn.a,sizeofnn.b); nn.a=12; printf("起始地址:%X,内存空间占用:%d ",&nn.a,sizeofnn.a); getchar(); } /* 起始地址:12FF40,内存空间占用:4 起始地址:12FF40,内存空间占用:8 起始地址:12FF40,内存空间占用:4 */
当一些事物具有更多共性,但有少量差异时,可以只用一个内嵌一个共用体的结构体来描述:
#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 结构体是不同数据类型的数据依次存储在一起
结构体各数据成员的引用可以通过其内存大小和字节对齐来相对于基址偏移来计算。结构体通常用于描述某一事物,用其成员来描述该事物的某些关键属性。让该事物既可以用结构体变量整体表示,也可以对其成员分别引用来处理该事物的各个属性。
#includeintmain() { structdemo{chara;shortb;intc;}abc;//成员相对于基址偏移,字节对齐 abc.b=12; short*p=(short*)((int)&abc+sizeof(short));//模拟编译器计算第2个成员的偏移地址 printf("%d%d ",abc.b,*p);//1212 printf("%d ",sizeof(structdemo));//8 getchar(); }
7 位域是对整型数据的按位处理
(一次可以处理n个位,1<=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(); }
位域(局部)二进制位显示:
#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(); } 原文标题:C 语言各数据类型的内存映像
文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。
审核编辑:彭静
-
数据
+关注
关注
8文章
6800浏览量
88733 -
内存
+关注
关注
8文章
2965浏览量
73808 -
C语言
+关注
关注
180文章
7591浏览量
135815 -
存储数据
+关注
关注
0文章
85浏览量
14080
原文标题:C 语言各数据类型的内存映像
文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论