Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does MSVC pick a long long as the type for -2147483648?

My snippet:

auto i = -2147483648;
int j = 3;
std::swap(i, j); // Compile error about mismatched types here. 

The compiler states that the literal i is a long long. Why is that? -2147483648 fits in an int on MSVC x64.

My compiler is MSVC, target is 64 bits.

like image 504
P45 Imminent Avatar asked Jan 11 '16 15:01

P45 Imminent


1 Answers

Contrary to popular belief, -2147483648 is not a literal: C++ does not support negative literal values.

It is, in fact, a compile-time evaluable constant expression consisting of a unary negation of the literal 2147483648.

On MSVC x64, which has 32 bit ints and longs, 2147483648 is too big for either of those so it fails over to the long long type that you observe.

like image 68
Bathsheba Avatar answered Sep 28 '22 07:09

Bathsheba