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.
So I think when "cloning" MSVC I need to not follow the standard.
In GCC the type is long (that is 64 bits)
https://godbolt.org/z/eTKE19r8K
Thiago Adams <thiago.adams@gmail.com> 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.
The type used by MSVC compiler seems not follow the C standard.
On Tue, 2 Sep 2025 17:10:25 -0300, Thiago Adams wrote:
The type used by MSVC compiler seems not follow the C standard.
Does anybody use MSVC for anything important any more?
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.
On Tue, 2 Sep 2025 17:10:25 -0300, Thiago Adams wrote:I have no hard data, but would estimate that at least 95% of
The type used by MSVC compiler seems not follow the C standard.
Does anybody use MSVC for anything important any more?
Sysop: | DaiTengu |
---|---|
Location: | Appleton, WI |
Users: | 1,069 |
Nodes: | 10 (0 / 10) |
Uptime: | 70:52:35 |
Calls: | 13,725 |
Files: | 186,960 |
D/L today: |
4,348 files (1,094M bytes) |
Messages: | 2,410,344 |