C语言各种数据类型的内存映像

c语言各种数据类型的内存映像(32位平台):
0 signed char
#include int main(){    char min = 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
#include int main(){    signed int smin = 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 , b promotes to unsigned  
2 double的二进制位显示
#include void printbyte(double d){    int bs = sizeof d;    unsigned char *ch = (unsigned char*)&d;    for(int i=0;i 将double分成4部分显示:
#include typedef struct packed_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*/  
3 数组是相同数据类型的依次存储
数组名是一个存储数据首元素地址具有常量性质的特殊指针,成员是相对于基址的偏移:
#include void printarr(short arr[],int len){    for(int i=0;i 4 枚举只是枚举可以取值的一些符号常量的一个特殊整型
#include int 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,枚举对数据的描述性更清晰。
5 共用体成员的起始地址相同,共用一块内存空间,值相互覆盖
#include int 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 12struct parts{ // 零件 int cost; char supplier[12]; char unit[12] ;};struct assembly{ // 装配件 int n_parts; struct {  char partno[12];  short quan; }parts[maxparts];};struct inventory{ // 存货类型,或是零件,或是装配件 char partno[10]; int quan; enum{part,assembly}type; // 存货类型 union {  struct parts parts;  struct assembly assembly; }info;};int main(){ 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;}  
6 结构体是不同数据类型的数据依次存储在一起
结构体各数据成员的引用可以通过其内存大小和字节对齐来相对于基址偏移来计算。结构体通常用于描述某一事物,用其成员来描述该事物的某些关键属性。让该事物既可以用结构体变量整体表示,也可以对其成员分别引用来处理该事物的各个属性。
#include int main(){    struct demo{char a; short b;int c;} 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();}  
7 位域是对整型数据的按位处理
(一次可以处理n个位,1<=n=0;i--)        printf(%d,(n & 1i);    printf();}struct bf{        unsigned a:3;        unsigned b:4;        unsigned c:5;}bf;int main(){    bf.a =1;    bf.b=15;    bf.c=3;    int *p = (int*)&bf; // 505    printf(%d,*p);    printbinm(*p);//00000000000000000000000111111001    getchar();}  
位域(局部)二进制位显示:
#include void printbinm(unsigned int n){    for(int i=31;i>=0;i--)        printf(%d,(n & 1i);    printf();}int main(){    struct bf{            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();} 原文标题:c 语言各数据类型的内存映像
文章出处:【微信公众号:linux爱好者】欢迎添加关注!文章转载请注明出处。


Kroger联手NVIDIA打造AI实验室 罗德与施瓦茨推汽车以太网测试方案
东风风光580这大气的7座SUV只卖7万,比奥迪Q5还帅,还买什么哈弗H6?
中国智能手机陷入“T型”竞争 下一站决战海外
鸿蒙系统截屏功能在哪里
什么是励磁电流
C语言各种数据类型的内存映像
3D成像技术在机器视觉中发挥的作用
高通与美的共同推动家电产品实现互联互通
OPPOO-Free体验 无论是从外形上还是实际体验上都有较好的表现
凯文.凯利:未来12个趋势(值得一读)
什么是边缘计算网关?边缘计算网关特点?边缘计算网关优势?
实时数据分析解决方案让芯片制造和测试事半功倍
高云半导体推出基于GW2AR系列的LED显示屏控制系统解决方案
MEMS的发展趋势是怎样的
AT-IFS802SP 工业级交换机解决方案
无人机锂电池六大养护法则
非隔离型开关电源的三种基本工作方式详细介绍
TC4011BP构成的光声控开关电路
新唐科技W588C051主板介绍
PD通信的基本原理 PD通信的相关过程