Я бы посоветовал вам использовать что-то вроде
#define UPPER(x) (x & (~0 << (sizeof(x) * 4)))
Это будет работать, даже если limit.h отсутствует или если по какой-то причине __WORDSIZE не определено. Кроме того, он также будет работать для других типов, так что вы можете, например, используйте его для int, short, char и т. д.
Любой приличный компилятор вычислит значение
sizeof(x) * 4
во время компиляции (так как они оба являются константами), что означает, что вам не нужно беспокоиться о каком-либо падении производительности.
EDIT: исправлена ошибка - sizeof возвращает размер в байтах, а не в битах, поэтому мы должны умножить на 4 (8/2), чтобы получить правильный результат. Спасибо тем, кто указал на это.
РЕДАКТИРОВАТЬ 2: Если вы хотите быть действительно педантичным, вы можете использовать
#define UPPER(x) (x & (~0 << (sizeof(x) * CHAR_BITS / 2)))
CHAR_BIT - это константа, определенная в limit.h - она определяет количество битов в символе и зависит от платформы. Тем не менее, это не является необходимым (в общем случае), поскольку в AFAIK нет платформ, которые обычно используют банкоматы, использующие байты нестандартного размера.