经典面试题(四)

第七题:

下面代码printf打印的结果是多少?

#include <stdio.h>

int main()
{
    unsigned int a = 0xfffffff7;
    unsigned char ch = (unsigned char)a;
    char* b = (char*)&a;
    printf("%08x, %08x\n", ch, *b);
    return 0;
}

运行结果:
这里写图片描述

PS:
1. unsigned int 强制转换成unsigned char会被截断
2. char* b = (char*)&a;这里是指针的转换,这里取决于a的内容,在此处刚好8位全部输出。

第八题:

下面代码printf打印的结果是多少?

#include <stdio.h>

int main()
{
    unsigned char a = 0xA5;
    unsigned char b = ~a>>4 + 1;
    printf("%d\n", b);
    return 0;
}

答案:250

PS:
b = ~a>>4 + 1执行的顺序是先执行~a,然后执行4+1,然后在执行以为操作(由运算符的优先级决定),另外需要注意的一点是:A5在寄存器的表示是 0000 0000 1010 0101,取反变成 1111 1111 0101 1010,右移5位变成1111 1111 1111 1010(这里的移位是算术移位,带着符号移位),由于是unsigned char类型,只能表示低8位,也就是250。

算术移位:1000 1000右移1位1100 0100(符号位不动,左边补位是补符号位)
逻辑移位:1000 1000右移1位0100 0100(高位直接补0)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值