Поскольку C ++ 20 представление с двумя дополнениями является единственным представлением, разрешенным стандартом, с гарантированным диапазоном от -2 N-1 до + 2 N-1 -1 , Таким образом, для 64-разрядного целого типа со знаком диапазон изменяется от -9'223'372'036'854'775'808
до 9'223'372'036'854'775'807
. Тем не менее, этот код не компилируется в Visual Studio (и ни в g cc)
int main()
{
long long x{-9'223'372'036'854'775'808LL};
// error C4146: unary minus operator applied to unsigned type, result still unsigned
// error C2397: conversion from 'unsigned __int64' to '__int64' requires a narrowing conversion
}
Тем не менее, если я заменю код на long long x{-9'223'372'036'854'775'807LL - 1}
, компиляция будет просто прекрасной, а x
будет содержать правильное значение , Что я не получаю здесь?