int data,data2,manage_1,manage_2,manage_3,manage_4;
	int output;
	int i=1;
	int max;//int是4字节,32位,max = 2^32 = 4294967296,int是有符号的
	int m=1;
	unsigned char a[3] = {48,48,48},next;
	//数组也还指针
	int   aa = 100;
	char  b[] = "hello";
	int	  *p_1;
	char  *p_2 ;
	p_1 = & aa;
	p_2 = b;

首先是定义一些变量,为后面使用。

同时需要知道的一点是1字节等于8位,int是4字节的也就是32位,char是1字节的是8位

  1. 像32位代表着啥,代表着他最大的取值是2^32次幂,但是int是无符号整数类型,由正负,所以超过2^16次幂的数据就为负数了,大家可以试一试。
  2. 因为计算机或者是单片机都是识别的二进制,那么4字节的二进制,是这样的 0000 0000 0000 0000  由4组0000组成,比如我定义了一个int a =48的,可以使用计算器进行计算,他的二进制是0000 0000 0011 0000 ,分别叫做高8位,中8位,中8位,低8位。对吧4*8是32

设定一个data = 48和data2 = 78,并利用printf进行输出他的十进制和十六进制


1.像int等数据类型到底可以存储多大的数。int数据最大是2的32次幂的数,但是超过2的16次幂的数就会是负数,负数的大小一般是:(设定的数-2的32次幂数)

2.|操作。记住一点有1为1,无1为0。|作用一般清零

解释:oxff是0000 0000 1111 1111| 0000 0000 0011 000 可以看到0xff都是1,所以说出为1(0xff是 1111 1111 我这里写的是32位,所以需要再高8位,和中8位为0000 0000)

3,&操作。全1为1,其他为0。 &的作用一般是赋值。

解释:oxff是0000 0000 1111 1111 & 0000 0000 0011 000  = 0000 0000 0011 0000 注意:30是16进制。

4.<<8 移位+&和+| 

解释:先执行括号里面的结果为0000 0000 0011 0000之后左移8位,为 0011 0000 0000 0000之后右面是&操作,也是0000 0000 0100 1110 并于前面的数据进行| 也就是 0011 0000 0000 0000 | 0000 0000 0100 1110 = 0011 0000 0100 1110

5.>>4,左移4位。

解释:data的数据是48 是0000 0000 0011 0000 与0000 0000 1111 1111 进行&操作,是 0000 0000 0011 0000 同时左移4位,00000 0000 0000 0011 。0x3的二进制是0011。

6.使用<<用法,注意一点

解释:<< 是进行移位操作,后面的数据是多少,就是在原来的数据上在后面添加几个0,注意这里的数组我用的是char类型,1字节,只有八位。0011 0000 左移2位是1100 0000。注意192是是十进制。

7.++i,i++。一个是先计算在运行,一个先运行在计算

有点小乱,这样吧,我吧程序贴上去,自己看看应该可以看明白。

#include <stdio.h>

int main()
{
	int data,data2,manage_1,manage_2,manage_3,manage_4;
	int output;
	int i=1;
	int max;//int是4字节,32位,max = 2^32 = 4294967296,int是有符号的
	int m=1;
	unsigned char a[3] = {48,48,48},next;
	//数组也还指针
	int   aa = 100;
	char  b[] = "hello";
	int	  *p_1;
	char  *p_2 ;
	p_1 = & aa;
	p_2 = b;

	data = 48;    //0000 0000 0011 0000
	printf("1.原始数据47 0x%x\r\n",data);

	data2 = 78;   //0000 0000 0100 1110
	printf("2.原始数据78 0x%x\r\n",data2);

	max   =  3200000000;  //int 是有符号的4字节,4294967296是最大的数,超过一半的数据就为负数
	printf("3.int max = %d\r\n",max); //测试的是int类型超出数据会怎么样
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	manage_1 = 0xFF | data;   // | 操作是有1为1,无1为0
	printf("4.数据与FF的|操作:0x%x\r\n",manage_1);
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	manage_2 = 0xFF & data;   // & 操作是全为1为1,其他为0
	printf("5.数据与FF的&操作:0x%x\r\n",manage_2);
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	manage_3 = (0xff & data ) << 8 | data2 & 0xff;  //先执行括号里面的结果为0000 0000 0011 0000之后左移8位,为 0011 0000 0000 0000
	//之后右面是&操作,也是0000 0000 0100 1110 并于前面的数据进行| 也就是 0011 0000 0000 0000 | 0000 0000 0100 1110 = 0011 0000 0100 1110
	printf("6.0x%x\r\n",manage_3);
	/////////////////////////////////////////////////////////////////////////////////////////////已验证	
	manage_4 = (data & 0xFF) >> 4;   //data的数据是48 是0000 0000 0011 0000 与0000 0000 1111 1111 进行&操作,是 0000 0000 0011 0000 同时左移4位,00000 0000 0000 0011 
	printf("7.左移4位,0x%x\r\n",manage_4);
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	next = a[1] << 2;       // << 是进行移位操作,后面的数据是多少,就是在原来的数据上在后面添加几个0,注意这里的数组我用的是char类型,1字节,只有八位。0011 0000 左移2位是1100 0000
	printf("8.next :%d\r\n",next);
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	if(data && data2){output = 1;printf("9.&&用法 :%d\r\n",output);} //其中data和data2都是有数据的,所以都是为真的,输出结果为1,所以进入语句里面
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	if( m++ == 2 ){printf("10.m++,ok%d\r\n",m);}//i++是先运行,再相加1,这里是不行的,先运行了,m的初始是1,并不等于2,所以不运行printf
	if( ++m == 3 ){printf("11.++m,ok%d\r\n",m);}//++i是先相加在运行,先运行是1+1等于2,相等就运行printf,但是这里需要等于3,因为上一个函数已经运行一遍了
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	if(i++ == 1 && ++i ==3 ){printf("12.yes\r\n");}  //这里先运行i++ i的初值是1,是等于1的,为真,之后i为2了,++i是先加在运行所以为3,也为真,即这个判断是真,输出printf
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	printf("13.地址(int类型,一个int占4字节的地址) :i的地址:%p i+1的地址 %p i+2的地址%p\r\n",&i,&i+1,&i+2); //定义一个int类型的变量并且取他的地址
	/////////////////////////////////////////////////////////////////////////////////////////////已验证	
	printf("14.a = %p,*p_1 = %d ,a+1 =%p,*p_1+1 =%d \r\n",aa,*p_1,aa+5,*p_1); //分别输出的是,aa的地址,*P_1的地址的值,aa+4的地址,*P_1+4的地址的值(对地址操作,加多少是多少)
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	printf("15.*号存的地址:p_2:%p P_2+1:%p\r\n",p_2,p_2+1);  //数组本身就是一个指针,所代表的也是一个地址
	/////////////////////////////////////////////////////////////////////////////////////////////已验证
	while(*p_2 !='\0'){	printf("16.取地址的内容:%c\r\n",*p_2++);}  //输出数组的内容
	return 0;
}

结果:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐