﻿# V629\. Bit shifting of the 32\-bit value with a subsequent expansion to the 64\-bit type\. Consider inspecting the expression\.

Анализатор обнаружил потенциальную ошибку в выражении, содержащем операцию сдвига\. В программе выполняется сдвиг 32\-битного значения\. Затем полученный 32\-битный результат явно или неявно преобразуется в 64\-битный тип\.

Рассмотрим пример некорректного кода:

```cpp
unsigned __int64 X;
X = 1u << N;
```

Данный код вызывает [неопределенное поведение](https://pvs-studio.ru/ru/blog/posts/cpp/0142/), если значение N больше 32\. На практике это означает, что с помощью этого кода не получится записать в переменную 'X' значение более 0x80000000\.

Код можно исправить, если тип левого аргумента будет 64\-битным\.

Исправленный вариант кода:

```cpp
unsigned __int64 X;
X = 1ui64 << N;
```



Обратите внимание, что диагностика V629 не относится к [64\-битным ошибкам](https://pvs-studio.ru/ru/pvs-studio/)\. Под 64\-битными ошибками понимаются те ситуации, когда 32\-битная версия программы работает корректно, а 64\-битная некорректно\.

Рассматриваемая здесь ситуация приводит к ошибке как в 32\-битной, так и в 64\-битной программе\. Поэтому диагностика V629 относится к правилам общего назначения\.



Анализатор не будет выдавать предупреждение, если результат выражения со сдвигом укладывается в 32\-битный тип\. Это означает, что значащие биты не потеряны и код корректен\. 

Пример безопасного кода:

```cpp
char W = 7;
long long Q = W << 10;
```

Этот код работает следующим образом\. Вначале переменная 'W' расширяется до 32\-битного типа 'int'\. Затем происходит сдвиг и получается значение 0x00001C00\. Это число помещается в 32\-битный тип, а значит ошибки не возникнет\. На последнем этапе это значение расширяется до 64\-битного типа 'long long' и записывается в переменную  'Q'\.