В стандарте языка говорится, что десятичный целочисленный литерал без суффикса должен иметь первый тип из списка: int, long int, long long int, который может представить значение этого литерала.
Однако, попытка компиляции такого кода:
int a = -2147483648;
в MS Visual Studio 2010 с 32-битными int'ом и long'ом, и 64-битным long long'ом приводит к появлению предупреждения "C4146: unary minus operator applied to unsigned type, result still unsigned".
Справка, говорит, что литерал 2147483648, слишком велик, чтобы поместиться в int, и потому он имеет тип unsigned int. Но ведь согласно стандарту в данной ситуации литерал 2147483648 должен иметь тип long long!
Почему в довольно таки простой ситуации в Visual Studio реализовано поведение, прямо противоречащее стандарту???
Исправлено ли это в более поздних версиях Visual Studio?
Такое поведение распространено среди других компиляторов?
gcc version 7.1.0 при таком коде
#include <iostream>
template<typename T>
void getType(T t){
std::cout << "T" << std::endl;
}
void getType(int t){
std::cout << "int" << std::endl;
}
void getType(unsigned int t){
std::cout << "unsigned int" << std::endl;
}
void getType(long int t){
std::cout << "long int" << std::endl;
}
int main(){
int a = -2147483648;
getType(a);
getType(-2147483648);
return 0;
}
выдает
int
long int
без всяких варнингов
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости