大小端问题:
大端:高位数据放低位地址,低位数据放高位地址。
小端:高位数据放高位地址,低位数据放低位地址。
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
右移负数位,前面补符号位