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.