记录一下笔试中遇到的几个问题:
- C++中无符号数与有符号数一起运算时,都会转换成无符号数运算
int main()
{
unsigned int a = 100;
signed b = -100;
cout << (unsigned)b << endl; // 4294967196
signed c, d;
c = a / b; // 相当于 100 / 4294967196
d = b / a; // 相当于 4294967196 / 100
cout << "c=" << c << " d=" << d << endl;
bool flag;
flag = b > a; // 相当于 4294967196 > 100
cout << flag;
}
2. 内存对齐跟变量声明的顺序有关,虚函数指针也会进行内存对齐
class A {
double d;
int a;
char c;
};
// sizeof(A)输出 16
class A {
int a;
double d;
char c;
};
// sizeof(A)输出 24
class A {
int a;
char c;
double d;
};
// sizeof(A)输出 16
class A {
int a;
static int b;
char c;
double d;
};
int A::b = 0;
// sizeof(A)输出 16,说明静态成员不影响类大小
class A {
int a;
static int b;
double d;
virtual int func(int x) { return x; }
};
// 32位下:sizeof(A)输出 24, 实际上是虚函数指针占4字节,进行内存对齐了
// 64位下:sizeof(A)输出 24, 实际上是虚函数指针占8字节
class A {
int a;
static int b;
virtual int func(int x) { return x; }
};
// 32位下:sizeof(A)输出 8, 实际上是虚函数指针占4字节,不用内存对齐
// 64位下:sizeof(A)输出 16, 实际上是虚函数指针占8字节,把a内存对齐了
- a和&a在数值上是一样的但是两者的数据类型不同,a指向数组首元素,是int类型,&a指向了整个数组,是int ()[]类型,所以a+1指向a[1],&a+1指向整个数组的下一个地址
int a[10];
cout << a << endl;
cout << &a << endl;
cout << &a[1] << endl;
cout << a + 1 << endl;
cout << (int*)&a + 1 << endl;
cout << (int*)((char*)&a + sizeof(int)) << endl;
cout << a + sizeof(int) << " "<< &a[4]<< endl; // 00DDFCC8 = 00DDFCB8 + 10,10是16的十六进制,相当于加了4*4=16个字节
cout << &a + 1 << endl; // 00DDFCE0 = 00DDFCB8 + 28,28是40的十六进制,+1相当于加了40个字节