I am studying XINU OS, and came across this simple one-line function. Is it possible to explain how this function is working and rounding x to nearest block size for memory allocation? Please don't mind if the query is too simple.
I am also confused why will the change it to a char pointer.
/*----------------------------------------------------------------------
*roundmb, truncmb - round or truncate address to memory block size
*----------------------------------------------------------------------
*/
#define roundmb(x) (char *)( (7 + (uint32)(x)) & (~7) )
Link to the complete XINU code: https://github.com/xinu-os/xinu/blob/master/include/memory.h
So this rounds up to the next factor of 8.
To open the incoming value is cast to be a number, so we can do proper maths on it.
First real step x + 7. This pushes the value up, so we only have to round down.
~7 is a bitmask, 0xFFFFFFF8. I would simplify and use 0xF8 when working it through with small numbers.
The added value is then combined with the bitmask. Basically we drop the last three bits.
This number is then cast to be a memory address, undoing the initial uint cast. Because you are dealing with memory blocks and presumably accessing data inside them it makes more sense to have it as a pointer.