https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96788
--- Comment #5 from joseph at codesourcery dot com <joseph at codesourcery dot com> --- The way GCC actually behaves is that this constant is unsigned in the preprocessor but signed outside the preprocessor. I'm not sure that's exactly intent (though the preprocessor having only a single signed and unsigned type, with this constant not fitting in the signed type, means it couldn't be interpreted as signed in the preprocessor if allowed in #if expressions at all). The warnings are attempting to cover both the C90 case where a decimal constant too large for signed long can be unsigned long, and the case of a constant too large for intmax_t.