Типы целочисленных литералов в MS Visual Studio

307
05 октября 2017, 13:47

В стандарте языка говорится, что десятичный целочисленный литерал без суффикса должен иметь первый тип из списка: 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?
Такое поведение распространено среди других компиляторов?

Answer 1

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

без всяких варнингов

READ ALSO
как разбить строку на структуру с++

как разбить строку на структуру с++

Проще всего, пожалуй, так:

324
Функция записи результатов в файл [требует правки]

Функция записи результатов в файл [требует правки]

Не уверен, что правильно сделал, но все же данные не сохраняются в txt файл их загрузка вроде как происходит (диск у курсора, VS 2015), но открывая...

271
Объясните пожалуйста в этой задаче в последнем примере как вывод получается? [требует правки]

Объясните пожалуйста в этой задаче в последнем примере как вывод получается? [требует правки]

У Егора есть взвешенный ориентированный граф, состоящий из n вершинВ этом графе между любой парой различных вершин есть ребро в обоих направлениях

295
Вывод двумерного vector&lt; vector&lt;int&gt;&gt;

Вывод двумерного vector< vector<int>>

Почему все элементы выводтся в столбецЕсли мы сначала в i кладем vector

219