华硕k505b如何识别镜像?
(华硕k505b硬盘在哪)
C语言各种数据类型的内存映像(32位平台):
0 signed char#include <stdio.h>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(i2==0) printf("\%d ",i); }getchar();}
output:
1 整型的signed和unsigned#include <stdio.h>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 <stdio.h>void printByte(double d){ int bs = sizeof d; unsigned char *ch = (unsigned char*)&d; for(int i=0;i<bs;i ) printf("%.2X ",*(ch i));}int main(){ int n = 0x01020304; if(*(char*)&n == 4) printf("小端:"; double d = 15.75; // 1111.11, 指数位值:1023 3 //0 100 0000 0010 1111100000000000000000000000000000000000000000000000 printByte(d);//00 00 00 00 00 80 2F 40 // 40 2F 80 // 0100 0000 0010 1111 1000 0000 getchar();}
将double四部分显示:
#include <stdio.h>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 <stdio.h>void printArr(short arr[],int len){ for(int i=0;i<len;i ){ printf("%d ",*(arr i)); }printf("\");}int main(){ short arr[]={1,3,2}; int len = sizeof arr / sizeof *arr; printArr(arr,len);}
4 枚举只是一种特殊的整形手术,枚举可以获得一些符号常量
#include <stdio.h>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 <stdio.h>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 <stdio.h>#include <string.h>#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); //22getchar();return 0;}
6 结构体依次存储不同数据类型的数据
可以通过其内存大小和字节对齐来计算结构体数据成员的引用。结构通常用来描述事物,并用其成员来描述事物的一些关键属性。结构通常用来描述一件事,并用它的成员来描述它的一些关键属性。让事物不仅可以用结构变量来表示,还可以引用它的成员来处理事物的所有属性。
#include <stdio.h>int main(){ struct demo{char a; short b;int c;}abc; // 成员相对于基址偏移,字节对齐 abc.b=12; short *p = (short*)((int)&abc sizeof(short)); // 模拟编译器计算第二个成员的偏移地址 printf("%d %d\",abc.b,*p); // 12 12 printf("%d\",sizeof(struct demo));// 8 getchar();}
7 位域是对整型数据的按位处理
(n个位可以一次处理,1<=n<=整形长度)
位置(全局)二进制位显示:
#include <stdio.h>void printBinM(unsigned int n)