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

Operations using 16 bits for 8 bits variables

Fellows,

in the code below:

    unsigned char test1, test2, test3, dummy;

    if (test1 != (test2 + 1))
        dummy = 0;
    if (test1 != (unsigned char)(test2 + 1))
        dummy = 0;
    if (test1 != (test2 + test3))
        dummy = 0;
    if (test1 != (unsigned char)(test2 + test3))
        dummy = 0;

why is it necessary to use the "unsigned char" cast to get operations only with 8 bits?

Please take a look at the disassembly window output below. I'm using C51 V9.03, optimization level 1. Starting at level 3, the code changes (I've not posted the code).

Thank you in advance,
Vitor.

    29:     unsigned char test1, test2, test3, dummy;
    30:
    31:     if (test1 != (test2 + 1))
C:0x528E    900B04   MOV      DPTR,#0x0B04
C:0x5291    E0       MOVX     A,@DPTR
C:0x5292    FF       MOV      R7,A
C:0x5293    7E00     MOV      R6,#0x00
C:0x5295    EF       MOV      A,R7
C:0x5296    2401     ADD      A,#0x01
C:0x5298    FF       MOV      R7,A
C:0x5299    EE       MOV      A,R6
C:0x529A    3400     ADDC     A,#0x00
C:0x529C    FE       MOV      R6,A
C:0x529D    900B03   MOV      DPTR,#0x0B03
C:0x52A0    E0       MOVX     A,@DPTR
C:0x52A1    FD       MOV      R5,A
C:0x52A2    7C00     MOV      R4,#0x00
C:0x52A4    ED       MOV      A,R5
C:0x52A5    6F       XRL      A,R7
C:0x52A6    7002     JNZ      C:52AA
C:0x52A8    EC       MOV      A,R4
C:0x52A9    6E       XRL      A,R6
C:0x52AA    6005     JZ       C:52B1
    32:         dummy = 0;
C:0x52AC    900B06   MOV      DPTR,#0x0B06
C:0x52AF    E4       CLR      A
C:0x52B0    F0       MOVX     @DPTR,A
    33:     if (test1 != (unsigned char)(test2 + 1))
C:0x52B1    900B04   MOV      DPTR,#0x0B04
C:0x52B4    E0       MOVX     A,@DPTR
C:0x52B5    FF       MOV      R7,A
C:0x52B6    EF       MOV      A,R7
C:0x52B7    04       INC      A
C:0x52B8    FF       MOV      R7,A
C:0x52B9    900B03   MOV      DPTR,#0x0B03
C:0x52BC    E0       MOVX     A,@DPTR
C:0x52BD    FE       MOV      R6,A
C:0x52BE    EF       MOV      A,R7
C:0x52BF    6E       XRL      A,R6
C:0x52C0    6005     JZ       C:52C7
    34:         dummy = 0;
C:0x52C2    900B06   MOV      DPTR,#0x0B06
C:0x52C5    E4       CLR      A
C:0x52C6    F0       MOVX     @DPTR,A
    35:     if (test1 != (test2 + test3))
C:0x52C7    900B05   MOV      DPTR,#0x0B05
C:0x52CA    E0       MOVX     A,@DPTR
C:0x52CB    FF       MOV      R7,A
C:0x52CC    7E00     MOV      R6,#0x00
C:0x52CE    900B04   MOV      DPTR,#0x0B04
C:0x52D1    E0       MOVX     A,@DPTR
C:0x52D2    FD       MOV      R5,A
C:0x52D3    7C00     MOV      R4,#0x00
C:0x52D5    ED       MOV      A,R5
C:0x52D6    2F       ADD      A,R7
C:0x52D7    FF       MOV      R7,A
C:0x52D8    EC       MOV      A,R4
C:0x52D9    3E       ADDC     A,R6
C:0x52DA    FE       MOV      R6,A
C:0x52DB    900B03   MOV      DPTR,#0x0B03
C:0x52DE    E0       MOVX     A,@DPTR
C:0x52DF    FD       MOV      R5,A
C:0x52E0    7C00     MOV      R4,#0x00
C:0x52E2    ED       MOV      A,R5
C:0x52E3    6F       XRL      A,R7
C:0x52E4    7002     JNZ      C:52E8
C:0x52E6    EC       MOV      A,R4
C:0x52E7    6E       XRL      A,R6
C:0x52E8    6005     JZ       C:52EF
    36:         dummy = 0;
C:0x52EA    900B06   MOV      DPTR,#0x0B06
C:0x52ED    E4       CLR      A
C:0x52EE    F0       MOVX     @DPTR,A
    37:     if (test1 != (unsigned char)(test2 + test3))
C:0x52EF    900B05   MOV      DPTR,#0x0B05
C:0x52F2    E0       MOVX     A,@DPTR
C:0x52F3    FF       MOV      R7,A
C:0x52F4    900B04   MOV      DPTR,#0x0B04
C:0x52F7    E0       MOVX     A,@DPTR
C:0x52F8    FE       MOV      R6,A
C:0x52F9    EE       MOV      A,R6
C:0x52FA    2F       ADD      A,R7
C:0x52FB    FF       MOV      R7,A
C:0x52FC    900B03   MOV      DPTR,#0x0B03
C:0x52FF    E0       MOVX     A,@DPTR
C:0x5300    FE       MOV      R6,A
C:0x5301    EF       MOV      A,R7
C:0x5302    6E       XRL      A,R6
C:0x5303    6005     JZ       C:530A
    38:         dummy = 0;
    39:
C:0x5305    900B06   MOV      DPTR,#0x0B06
C:0x5308    E4       CLR      A
C:0x5309    F0       MOVX     @DPTR,A

0