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

making a short out of a msb+lsb char

Hi all,

I'm new to C and need a hint on an optimization problem.

I have a 16 bit counter, divided into two 8bit SFRs, let's say TH0 and TL0, and I want to transfer them to a short.

I could:
mshort = (short)TH0 * 256 + TL0

but this takes 16bytes, similar to something like:
mshort = (short)TH0 << 8 + TL0

I would like to do it more simple, like:
MSB of mshort = TH0
LSB of mshort = TL0

I tried it that way:
unsigned short *pINT;
pINT = &TH0;

but this is not possible with SFRs.

Something else I tried:
unsigned short mINT;
unsigned char *pChar;
pChar = & mINT;
*pChar = TH0;
*(pChar + 1) = TL0;

results in even more code (31 bytes)

So I think it would be the easiest, if I could place 2 char variables at the same address, covered by my short, like:

unsigned short mINT;
unsigned char mChar[2] (at the same address like mINT)

mChar[0] = TH0;
mchar[1] = TL0;

but I don't know, how to place the mChar array at the same address of mINT. I tried it with:

unsigned char mChar[2] _at_ mINT;

but this is not possible (compiler error).

So anyone here, who could give me a hint how to place both variables at the same address?

Thanks in advance

Marco Della Rocca

Parents
  • "Short" is a standard C type. Like the other C types, the actual width in bits of the type is implementation dependent. The standard tells you that:

    - a short is at least 16 bits wide
    - a long is at least 32 bits wide.
    - an int is at least as wide as a short and no wider than a long.

    Everything else is up to the implementation.

    Almost all embedded programmers I know adopt a local convention of typedefs that specify the exact width, e.g.

    typedef U8 unsigned char;
    typedef U16 unsigned int;
    typedef U32 unsigned long;

    typedef S16 signed int;
    typedef S32 long;

    so that they can remain platform independent.

    The C99 standard introduces a new header, <inttypes.h>, with standard names for these types, e.g.

    uint8_t
    uint16_6

    The standard also adds some "half open" types with semantics like "any integer width you like as long as it's at least 16 bits wide".

    Other popular spellings include UINT8, UINT16, etc.

    You also see BYTE, WORD, DWORD, QWORD. I don't personally care for these because the width of a "word" is really hardware dependent. It's not always 16 bits, though that's what people using this series of names expect. Putting the actual number of bits in the type name is much more clear.

Reply
  • "Short" is a standard C type. Like the other C types, the actual width in bits of the type is implementation dependent. The standard tells you that:

    - a short is at least 16 bits wide
    - a long is at least 32 bits wide.
    - an int is at least as wide as a short and no wider than a long.

    Everything else is up to the implementation.

    Almost all embedded programmers I know adopt a local convention of typedefs that specify the exact width, e.g.

    typedef U8 unsigned char;
    typedef U16 unsigned int;
    typedef U32 unsigned long;

    typedef S16 signed int;
    typedef S32 long;

    so that they can remain platform independent.

    The C99 standard introduces a new header, <inttypes.h>, with standard names for these types, e.g.

    uint8_t
    uint16_6

    The standard also adds some "half open" types with semantics like "any integer width you like as long as it's at least 16 bits wide".

    Other popular spellings include UINT8, UINT16, etc.

    You also see BYTE, WORD, DWORD, QWORD. I don't personally care for these because the width of a "word" is really hardware dependent. It's not always 16 bits, though that's what people using this series of names expect. Putting the actual number of bits in the type name is much more clear.

Children