floor() is standard C function from math.h. I would rename it.
Here's your macro.
#define sat(y, x, flr, ceiling) \ if( (x) > (ceiling) ) \ (y) = (ceiling); \ else if((x) < (flr)) \ (y) = (flr); \ else \ (y) = (x)
"\" at line end allows to create multiline macro. Yes, you could write it in one line, but this may be more readable (or not). Never forget to put macro arguments into (), else it may bite you if used with more complex expressions as arguments.
Is it good practice? Maybe yes, maybe no. Just look at usage:
sat(y, y,0,5);
sat(z,x,0,5);
Looking at just these two lines it is not clear what's going on there. Good if you used there for years and know arguments order, or if there's decent comment left at each line. Removing destination argument and reducing arg number to 3 could be easier to remember args order, like sat( x, min, max). But still not perfect thinking about maintenance. Though, you may have different opinion.
Be careful using these macros with different types. Comparing signed type to unsigned, or char to long can be tricky. if/else three isn't much better at mixed types, but at least you will see the code while debugging. Replacing macro with if/elses would take you additional time.. Just IMO, I'm not saying macros don't help