Consider the following snippet from code running in the Linux kernel:
char *d; u32 mask, step, val; ... /* d is initialized with valid pointer pointing at buffer, and mask, step and val are initialized to some sane values as well. */ ... val = (*d & mask) >> step;
As you see only
d is of
char * type, the rest are unsigned integers. I know that C performs type conversions automatically when
values of differing types participate in expressions, in this case
bit-wise operation. So, I'm assuming it is guaranteed that
*d will be promoted to
uint32_t as well?
If this assumption is correct, my 2nd question would be about the byte-order of 4 bytes located at memory pointed by
d. I think it has to be whatever byte-order the host implements, or if it's networking, then strictly big-endian.
d has type
char * it reads a single byte at the address pointed to by
d. So the expression
*d has type
char which has the value of the byte pointed to by
d. Endianness doesn't matter here because only a single byte is read from
In the larger expression
*d & mask, the value
*d which has type
char is converted to
uint32_t for use in the expression.