Этот вопрос Неявные правила преобразования типов в операторы на С++ (и несколько других) state
Если длинный long unsigned int другой, то длинный длинный unsigned int
Однако, если я делаю следующее в MSVC:
unsigned int a = <some expression>;
unsigned long long b = a << 32ULL;
Вторая строка генерирует следующее предупреждение:
warning C4293: '<<': shift count negative or too big, undefined behavior
32ULL
- это 64-разрядное значение без знака, поэтому в соответствии с правилами неявного преобразования это означает, что a
также преобразуется в unsigned long long
. Следовательно, я перехожу на 64-битное значение на 32 бита, явно четко определенную операцию.
Является ли MSVC прослушиваемым или есть недостаток в моей логике?