数据类型
1.基本类型
字符型char 整型 short,int ,long ,unsigned 实型(单精度型float,双精度型double) 枚举类型enum
2.构造类型
数组类型 [ ] 结构体类型 struct 共用体类型 union
3.指针类型
*
4.空类型
void整形类型
char;//1 short;//2 int;//4 long int;//4 long long;//8 unsigned char;//1 unsigned short;//2 unsigned int;//4 unsigned long int;//4 unsigned long long;//8 float;//4 double;//8 long double;//8,12,16 bool;//1 void;//不能定义变量,但可以定义指针数据在内存中如何表示?
—数据在内存中的存储方式
以二进制存放,十六进制观察
int main()
{
char ch = 'a';
short sa = 0x1234;
int ia = 0x12345678;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOXyjR4K-1633417742055)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004102733696.png)]
如何测试小端存放,还是大端存放计算机存储整型数据是以补码存储的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W91inF9S-1633417742057)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004110750092.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdhdZurx-1633417742058)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004110916134.png)]
CPU只有一种运算—加法运算,通过补码的形式,把减法变为加法
char ,signed char 和 unsigned char[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Du9Ksuog-1633417742065)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004111706057.png)]
1000 0000— -128
int main()
{
for(char a = 0;a<128;++a)
{
printf("%4d",a);//死循环
}
printf("n");
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMJNTrdG-1633417742071)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004112742880.png)]
int main()
{
for(unsigned char a = 0;a<128;++a)
{
printf("%4d",a);
}
printf("n");
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSRFow2v-1633417742073)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004113010785.png)]
int main()
{
for(unsigned char a = 0;a<256;++a)
{
printf("%4d",a);//死循环
}
printf("n");
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uTEtiHdl-1633417742074)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004113122257.png)]
十六进制:0x0000 ~ 0xFFFF
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIq0Ndhh-1633417742075)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004113801739.png)]
整型数值的转换(扩充)char, short, int, long int, long long
表示范围小的整形变量赋值给表示范围大的整形变量的扩充方式:
1.有符号数,扩充符号位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FsmldDrv-1633417742078)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004114216567.png)]
2.无符号数,扩充0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpWqUZGf-1633417742079)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004114348923.png)]
整型数值的转换(切片或截取)从低地址开始切
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrCmZtX7-1633417742080)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211004114808634.png)]
int main()
{
int a = 300;
//0000 0000 0000 0000 0000 0001 0010 1100
char b = a;//0010 1100
printf("%d n",b);//44
return 0;
}
位运算
char a = 44;
char b = 0x57;
char c = 0;
c = a && b;//c = 1;
c = a & b;//位与 //按位相与
a => 0010 1100
b => 0101 0111
c => 0000 0100
c = a | b;//位或 //按位相或
a => 0010 1100
b => 0101 0111
c => 0111 1111
c = a ^ b;//异或 //相异为1,相同为0
a => 0010 1100
b => 0101 0111
c => 0111 1011
c = ~a;//位反
a => 0010 1100
c => 1101 0011
a = 44;
a => 0010 1100
a = a>>1;//右移 /2
//有符号位,则写符号位;无符号位,则写0
a => 0001 0110
a = 44;
a => 0010 1100
a = a << 1;//左移 *2
//有符号位,则写符号位;无符号位,则写0
a => 0101 100
左移或者右移优先级比加法低
int Get1Bit(int x)
{
int sum = 0;
while(x)
{
if(x & 0x01)
{
sum += 1;
}
x = x >> 1;
}
return sum;
}
int main()
{
int x = 0;
scanf_s("%d",&x);//不能为负数,正数均可
int sum = Get1Bit(x);
printf("sum : %d n",sum);
return 0;
}
int Get1Bit(int x)
{
int sum = 0;
while(x)
{
x = x & (x - 1);//每次消去一个1
sum += 1;
}
return sum;
}
int main()
{
int x = 0;
scanf_s("%d",&x);//正负数均可
int sum = Get1Bit(x);
printf("sum : %d n",sum);
return 0;
}
查表方式计算1的个数
思考题int Get1Bit(int x)
{
int sum = 0;
for(int i = 0;i < sizeof(x)*2;++i)
{
sum += " 112122312232334"[x & 0x0f];
x = x >> 4;
}
return sum;
}
int main()
{
int x;
x = x^x;
printf("%d ",x);//自身异或,为0
return 0;
}
如何找到只出现一次的值—异或在面试中的应用,只有这一个
异或满足结合律,自身和自身异或为0
int main()
{
int ar[] = {1,2,3,4,5,6,7,6,5,3,2,1};
int n = sizeof(ar)/sizeof(ar[0]);
int tmp = ar[0];
for(int i = 1;i
扫雷游戏—位运算
如何把某一位设置为1,如何把某一位设置为0
如何对一个二进制位进行精确的定位
#define ROWSIZE 12
#define COLSIZE 12
#define MINESIZE 64
#define SHOWINIT 0x80 //@
#define MAKEMINE 0x40
#define SHOWMINE 0x20 //#
#define MAKESUM 0x10
#define SHOWSUM 0x0F
#define CLEARINIT 0x7f //0111 1111
#define CLEARMINE 0xDF
typedef unsigned char MineType[ROWSIZE+2][COLSIZE+2];//九宫格
void Init_Ar(MinrType ar)
{
for(int i = 1;i<=ROWSIZ;++i)
{
for(int j = 1;j <= COLSIZE;++j)
{
ar[i][j] = ar[i][j] | SHOWINIT;
}
}
int i = 0;
while(i ROWSIZE ||col <1 ||col > COLSIZE)
{
printf("row col inut error n");
continue;
}
if(ch == '#')
{
ar[row][col] &= CLEARINIT;
ar[row][col] |= H=SHOWMINE;
if(ar[row][col] & MAKEMINE)
{
++i;
}
}
else if(ch == '0')
{
if(ar[row][col] &MAKEMINE )
{
printf("炸死");
break;
}
ar[row][col] &= CLEARINIT;
}
}
}
作业
分段函数—用位运算
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OkUvYE9J-1633417742082)(C:UsersLenovoAppDataRoamingTyporatypora-user-imagesimage-20211005150229624.png)]
如何对齐?
内存分配方案—内存对齐



