On 1/26/07, Miguel Pereira <[EMAIL PROTECTED]> wrote:
Hi,

Your are right! I put 65535UL and the warning disappear. Although I think
should not be necessary to add UL to the number. If the variable is uint32_t
should handle with the number 65535 without UL.

The warning is correct. The C standard specifies the result type of
operations like /, +, etc based on the type of the arguments, not on
the type of where the result is eventually used. So in:

 int16_t a, b;
 int32_t c;

 c = a * b;

The multiplication is a 16-bit multiplication, not a 32-bit one. It's
easy to get caught by this, especially on platforms with 16-bit ints.
For instance,

 int32_t x = 1 << 24;

will give you x == 0 on an atmega128 (or msp430, etc) (the type of 1,
24 is int, i.e. int16_t in this case, the type of << applied to two
int16_t's is int16_t).

In the case of
 uint16_t random;
 uint64_t result = (uint64_t) ( ((1000)*random) /65535);
we have:
 1000*random:
   int16_t * uint16_t -> result is uint16_t

 (1000*random)/65535): this one is complex:
   - the first argument is uint16_t.
   - the 2nd argument (65535) is trying to be an int (you didn't use
U or L as suffix), but doesn't fit within a 16-bit integer (hence the
warning you don't like) so it's treated as a uint16_t
   - the result is an uint16_t (we're dividing two uint16_t's)

 (uint64_t) ( ((1000)*random) /65535):
   we're casting a uint16_t to a uint64_t (note that this cast is
useless, as the conversion to uint64_t would happen in the assignment
anyway)

 uint64_t result = (uint64_t) ( ((1000)*random) /65535);
   we're assigning a uint64_t to a uint64_t

David Gay
PS: Who said C was simple?
_______________________________________________
Tinyos-help mailing list
[email protected]
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to