2010707总复习2

大小端问题:
大端:高位数据放低位地址,低位数据放高位地址。
小端:高位数据放高位地址,低位数据放低位地址。

int a = 1;// 00 00 00 01 从右往左是由低到高
存储地址从左到右是从低到高
大端:高数据放入低地址
			00 00 00 01
			01 02 03 04
		输出时,正向输出
小端:低数据放入低地址
			01 00 00 00
			01 02 03 04
		输出时,反向输出

如何判断系统是否为大小端;

bool checkmodle()
{
	union
	{
		char ch;
		int a;
	}un;//利用存储于空间时,任意类型的字节全是从第一位开始。
	un.a = 1;
	return un.ch == 1;//即是低位数据存于低地址,所以是小端
}
void main()
{
	bool flag = checkmodle();
	if(flag)
	{
		xiaoduan
	}
	else
	{
		daduan
	}
}

当声明一个虚函数时,虚函数有一个虚指针,存在于虚函数表中

typedef struct Test
{
	int a;
	double b;
	char c[0];//此种类型只能放最后,而且对于字符串类型的话,可以输出,因为放在了栈区
	如果不是字符串类型的话,则不能输出结果
};

新的一种开辟空间的方法:

typedef struct Test
{
	int a;
	double b;
	int pi[0];
}
void main()
{
Test *pt = (Test*)malloc(sizeof(Test) + sizeof(int) * 10);
for(int i = 1;i <= 10;++i)
	pt->pi[i - 1] = i;
for(i = 0;i < 10;++i)
{
	cout<<pt->pi[i]<<" ";
}
}
当位域时候,
typedef struct Test
{
	char a : 7;
	char b : 2;//看所有相加是否大于8
	char c;//算一个
	char d : 8;//看之后相加是否大于8
}

int main()
{
	char c;
	unsigned char uc;
	unsigned short us;//无符号char从0-255,单纯char 从-128-127
	c = 128;
	uc = 128;
	us = c + uc;
	printf("0x%x\n",us); // 0
	
	us = (unsigned char)c + uc;
	printf("0x%x\n",us);//256
	
	us = c + (char)uc;
	printf("0x%x\n",us); //-256,求原码,需要将负的二进制-1,再取反
	return 0;
}
void main()
{
	int a = -1; 
	//1111 1111 1111 1111 1111 1111 1111 1111
	//1111 1111 1111 1111 1111 1111 1111 1110
	//1000 0000 0000 0000 0000 0000 0000 0001//补码取原码先减一后取反,取反时,符号位不变。
	//以补码存储,但是输出以原码输出(只有负数才会这样)
	cout<<a<<endl;

局部变量出了作用域之后会被销毁

unsigned short *sum(unsigned char a, unsigned char b)
{
	unsigned short s = 0;
	s = a + b;
	return &s;//s除了空间后会被销毁
}

对于逻辑运算符,可能会造成短路求值

void main()
{
	int a = 0;
	int b = 2;

	int v = a && ++b; //短路求值 a为0时,此语句已经能判断出结果,所以b不会执行++,最后b值依然还是2

	cout<<b<<endl;
}

左移和右移
右移n位,原数据除以2的n次方
左移n位,原数据乘以2的n次方
当n大于32时,n-32
右移负数位,前面补符号位

发布了39 篇原创文章 · 获赞 10 · 访问量 760

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/94979746
今日推荐