那些年我们遇到的c面试题

1.这是一道关于结构体对齐补齐的题;

在32为IBM-PC机上使用C语言,若有如下定义:
structA{
    char c; 
    short s[2];
    int i;
}a;
则变量a所占用的字节数和成员布局为 (C:char,S:short,I:int,X:填充字节)。
A.9,CSSSSIIII
B.10,CXSSSSIIII
C.12,CXSSSSXXIIII
D.12,CXXXSSSSIIII

分析:

c语言中结构所占内存理论上来说是各成员的内存量之和,但还有他独有的规则(对齐补齐);

所谓对齐,就是成员内存的起始地址必然是他自身所占内存的整数倍;

补齐,则是指结构的内存总量是最大成员的整数倍,最大成员超过4字节的按4字节算.

 根据上面的原则, 布局为cxssssxxiiii 总共12字节, 所以c为正确答案.

2.关于位与运算

int x = 9999,y;
for(y = 0; x; y++)
    x = x & (x - 1)
printf("%d\n", y);

输出是?

分析:

9999 二进制 10011100001111

第一次&(x-1)将最右边的1置零

第一次&(x-1)将右边第二个1置零

……

依次类推

直到x变成0

所以x有几个1就会有几次位与运算

所以9999总共要进行8次位与运算。

3.关于类型提升(integer promotion)

unsigned char a = 0xa5;
unsigned char b = ~a>>1+2+3;
printf("%d\n", b);
输出结果是?

这道题的最终结果是253. 刚开始我百思不得其解,后来我在论坛上发了个类似的帖子求助,在高手的指导下

我终于明白了其中的道理;

分析:

~a的结果被提升为int (4字节) 即:0xffffff5a

然后右移6位:即为:0xfffffffd

再转为unsigned char  为:0xfd==>253.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值