This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Bitwise logical AND stores in a bit ....

Hi,

I get a curious result when compiling such a following code :

typedef union  {

  unsigned char                cCtrlFullByte;

  struct {
    unsigned char  bEnable          : 1;
    unsigned char  cUnused          : 7;

  }  cCtrlStruct;
} CtrlUnion;

void main (void)  {

    unsigned char  dummy = 0x55;
    CtrlUnion  xdata    bitUnion;

    bitUnion.cCtrlStruct.bEnable = dummy & 0x40;

    return;
}


It results in :
MOV A,#0x55
ANL A,#0x00
MOV R7,A
MOV DPTR, #0x0000
MOVX A,@DPTR
ANL A,#0xFE
ORL A,R7
MOVX @DPTR, A 

I thought that the bit result of bitwise logical AND is 1 if result is not 0, else 0.
It seems that I didn't understand ANSI the same way than Keil compiler ? Am I wrong ?

Arnaud DELEULE

Parents
  • That bit of assembly code looks wrong. Should it not read:

    ...
    ANL A,#0x40
    ...
    
    It is, in my opinion, something of a failing of 'C' that in spite of having logical operators it does not offer a boolean type. I make it a habit to always use a logical operator when I want an boolean result. This removes any possibility of confusion and is something that the Keil compiler generally handles efficiently.

    For example, I would write:
    bitUnion.cCtrlStruct.bEnable = ( dummy & 0x40 ) != 0;
    

Reply
  • That bit of assembly code looks wrong. Should it not read:

    ...
    ANL A,#0x40
    ...
    
    It is, in my opinion, something of a failing of 'C' that in spite of having logical operators it does not offer a boolean type. I make it a habit to always use a logical operator when I want an boolean result. This removes any possibility of confusion and is something that the Keil compiler generally handles efficiently.

    For example, I would write:
    bitUnion.cCtrlStruct.bEnable = ( dummy & 0x40 ) != 0;
    

Children