Could someone explain?

This ex. will not work

char	data	test;

char TestF(void);

char TestF(void)
{
if (test == 0x8A)
	{
	//...
	return(1);
	}
}
//Take a look at the Assambly code
             ; FUNCTION TestF (BEGIN)
                                           ; SOURCE LINE # 5
                                           ; SOURCE LINE # 6
                                           ; SOURCE LINE # 7
                 R     MOV     R7,test
                       MOV     A,R7
                       RLC     A
                       SUBB    A,ACC
                       MOV     R6,A
                       MOV     A,R7
                       XRL     A,#08AH
                       ORL     A,R6
                 R     xJNZ    ?C0002
                                           ; SOURCE LINE # 8
                                           ; SOURCE LINE # 10
                       MOV     R7,#01H
                                           ; SOURCE LINE # 11
                                           ; SOURCE LINE # 12
             ?C0002:
                       RET
But this one works
char	data	test;

char TestF(void);

char TestF(void)
{
if (test == (char)0x8A)
	{
	//...
	return(1);
	}
}
//Take a look at the Assambly code
             ; FUNCTION TestF (BEGIN)
                                           ; SOURCE LINE # 5
                                           ; SOURCE LINE # 6
                                           ; SOURCE LINE # 7
                 R     MOV     A,test
                 R     xJNE    A,#08AH,?C0002
                                           ; SOURCE LINE # 8
                                           ; SOURCE LINE # 10
                       MOV     R7,#01H
                                           ; SOURCE LINE # 11
                                           ; SOURCE LINE # 12
             ?C0002:
                       RET

Parents
  • Hi,

    look more careful at the next two lines:

    char	data	test;
    
    if (test == 0x8A)
    

    you declared signed 1-byte wide variable and then compare it with number which may not be presented with signed char!
    Really, signed char may be inside
    -128...127 border but 0x8A is overload this limit. So cimpiler converts your signed char variable into int one before comparing.

    At second example, you said to compiler that number must be converted to signed char one before comparasion. So it just accept it as signed 1-byte value.

    Regards,
    Oleg

Reply
  • Hi,

    look more careful at the next two lines:

    char	data	test;
    
    if (test == 0x8A)
    

    you declared signed 1-byte wide variable and then compare it with number which may not be presented with signed char!
    Really, signed char may be inside
    -128...127 border but 0x8A is overload this limit. So cimpiler converts your signed char variable into int one before comparing.

    At second example, you said to compiler that number must be converted to signed char one before comparasion. So it just accept it as signed 1-byte value.

    Regards,
    Oleg

Children
More questions in this forum