疑惑不解,求助!C语言自动数据类型转换碰到的一个问题

2019-07-21 03:57发布

有个关于C语言的数据类型自动转换的问题,代码如下:

#include "reg51.h"  //此代码为在STC89C52上的运行结果
void main(){
    unsigned int retval;
    char a;
    UartInit();
    a=0xc0;
    retval=(a>>6)&0xff; //此处位与的立即数若为0xff,则通过串口输出查看retaval为 0x0003; 若位与运算的立即数为0xfe则结果为 0x00fe; 为何会如此
    UartTxInt(retval);
    while(1){
        ;
    }
}
疑问.png
代码如上所写,即retval=(a>>6)&0xff; 这一句执行后,为何用串口查看retval为0x0003?
按照我的理解,
①首先因为a是char类型,所以在参于运算时首先自动转换为int类型,所以右移6位后数据内容为bit: 1111 1111 1111 1111 ;
②再与立即数0xff进行位与运算,立即数默认为int类型,所以相当于0xffff & 0x00ff ;
③结果即应该为 0x00 ff 才对,但是在单片机上运行的结果却为0x0003 ;
④很诡异的是,如果我将上述语句的0xff 替换成 0xfe, 那么运算的结果就如预期的变成 0x00 fe 了。

因为对C语言的数据类型的自动转换理解还不太到位,所以想请问各位大神上述计算的结果是怎样来的,我的理解哪一步有错误呢,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
nashui_sx
2019-07-21 13:44
nashui_sx 发表于 2019-3-22 17:22
①a=0xc0=1100 0000 >6  =0000 0011(高位补零)   & 0xff =0000 0011 =3

可是a我是声明的char  在右移时候不是应该要扩展符号位所以为 1111 1111才对么?

如果像你说的这样的按unsigned char右移,那为何当后边的&0xff 修改成0xfe 时整个运算的结果又成了0xfe了?
有哪里理解错误吗,还请解答,谢谢

一周热门 更多>