Convert an `int` to a C string with size limitation
Use some constants:

This char buf[sizeof x * CHAR_BIT * 10 / 33 + 3];

Would be a lot better if written like this: char buf[MAX_CONV_CHARS]; (or any other name your might prefer for the constant).

Also, do you really care about being that exact with the size of buf? I usually just throw some large number that can't overflow, like 128.

Return early:

Instead of nesting the entire function under an if, return early:

char *int_strnull(int x, char *dest, size_t dest_size) {

    if ((dest == NULL) || (dest_size &lt; MIN_SIZE)) {
        return NULL;
    }


Mind your naming:

xna is an abbreviation for what exactly? Not obvious to me. x is also very vague. Call it input, number or even value.

int_strnull() also seems odd. Why not just int_to_string()?

Local buffer actually needed?

Finally, I don't really get the necessity of the local buffer buf. Why not simply write to dest directly. That would also save a memcpy at the end. I guess you did that to first figure out the total length of the string. But since it is such a small string, I would suggest just requiring that the output buffer be at least the maximum size.