Path: csiph.com!eternal-september.org!feeder.eternal-september.org!nntp.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch Newsgroups: comp.lang.c Subject: Re: type of decimal constants in msvc Date: Mon, 15 Dec 2025 08:06:02 -0800 Organization: A noiseless patient Spider Lines: 62 Message-ID: <86345bvifp.fsf@linuxsc.com> References: <1097ivh$ntii$1@dont-email.me> <87jz2gbn19.fsf@example.invalid> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Mon, 15 Dec 2025 16:06:05 +0000 (UTC) Injection-Info: dont-email.me; posting-host="3b66f75cc16331490dd39d06d7ef9603"; logging-data="2116619"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19U+nwbZgQVKLNxGkaRUmQTa61PEYDxx+I=" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:XTdd6YVUT/VeJ135ZyMeX1+tnOc= sha1:x5xH6rSsz7CmGXdf+Of4ud4n+FE= Xref: csiph.com comp.lang.c:395816 Keith Thompson writes: > Thiago Adams writes: > >> The type used by MSVC compiler seems not follow the C standard. >> >> I choose the number 2147483648 that is the next number after max >> signed i32. >> >> I was expecting "signed long long" (the next signed type) but MSVC >> instead uses unsigned long (that is 32 bits) >> >> >> #define is_type(T, E) _Generic(E, T : 1 , default:0 ) >> >> static_assert(is_type(unsigned long, 2147483648)); >> >> int main(){} >> >> https://godbolt.org/z/EqKWroecj >> >> >> The the standard says >> "The type of an integer constant is the first of the >> corresponding list in which its value can be represented." >> >> No suffix: The potential types, in order, are int, long int, and >> long long int. > > Yes, that appears to be a bug. > > I tried an example myself with Visual Studio 2022. By default, it > gives 2147483648 a type of unsigned long. > > The default configuration is "/std:c17". I thought it might be an > "extension" that I can disable with "/Za", but astonishingly that > produces a fatal error: > > error D8016: '/Za' and '/std:c17' command-line options are > incompatible > > *Maybe* there's some combination of options that will persuade it to > behave correctly. > >> So I think when "cloning" MSVC I need to not follow the standard. > > I suppose, but it depends on why you want to clone MSVC and whether > you need to replicate its bugs. > > I don't know whether this bug has been reported to Microsoft. If > not, it should be. > >> In GCC the type is long (that is 64 bits) >> >> https://godbolt.org/z/eTKE19r8K > > On targets with 32-bit long, it should be long long. It might be the case that the behavior observed is a consequence of Microsoft never fully embracing C99. Under C90 rules, the type of 2147483648 (assuming 32-bit longs and unsigned longs) would indeed be unsigned long.