您的位置:首页 > 编程语言 > C语言/C++

C++笔试中的一些问题摘抄

2013-08-06 10:21 155 查看
1.结构体求字节大小问题
struct
{
char a;
short b;
int c;
}S1;
struct
{
char a;
int b;
short c;
}S2;
cout<<sizeof(S1)<<""<<sizeof(S2);//8 12
}
对于S1,因为最大是int,所以前面得char+short+1=4,在int=4,所以S1大小为8。S2char得补成int,short也一样,所以是3*4=12;

结构体默认的字节对齐一般满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量(offset,即每个成员的起始地址)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

注意:当结构体成员里面有数组成员时,如int a[10],要看成10个整形变量才参与计算。

2.

signed char a =0x80;

unsigned int b = a;

unsigned char c = a;

cout<<"a:"<<(int)a<<endl;//a:-32(signedchar比较时候类型要提升成int,符号位是补最高位的1(若最高位是0则补0),a的值为取反+1,为-32)

cout<<"b:"<<b<<endl;//b:4294967264(符号位是补最高位的1,0xffffffe0)

cout<<"c:"<<(int)c<<endl;//c:224(14*16=224)

3.

string f(){string s="a";cout<<"hello";return s;}
string g(string&str){cout<<str;return"hi a";}
int i = 0;
constint &i=0;//可以编译
//int &i=0;// 不能用非对象去初始化一个引用。
char a[10];
if(!!i){f();}//可以编译通过
g(f());//可以编译通过
//a=a+1;//因为a是一个地址常量,不能被重新赋值
//g("ABC");//因为“ABC”是一个const char*类型,而g函数参数还是非const的
4.

unsigned
int a =0x1234;
char b = *((char*)&a);
cout<<(int)b;//输出52,若不添加(int)则输出4,ascaII码值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: