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

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码值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值