﻿# V784\. The size of the bit mask is less than the size of the first operand\. This will cause the loss of the higher bits\.

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

Рассмотрим несколько примеров, для которых анализатор выдает данное диагностическое сообщение:

```cpp
unsigned long long x;
unsigned y;
....
x &= ~y;
```

Посмотрим подробнее, что происходит с битами после каждой операции на примере выражения:

```cpp
x = 0xffff'ffff'ffff'ffff;
y = 0xff;
x &= ~y;
```

![V784_ru/image1.png](https://import.viva64.com/docx/blog/V784_ru/image1.png)

Как правило это не тот результат, который планировал получить программист:

```cpp
0xffff’ffff’ffff’ff00 – ожидалось
0x0000’0000’ffff’ff00 – получилось
```

Код можно поправить, явно приведя переменную `y` к типу, которая имеет переменная `x`: 

```cpp
x &= ~(unsigned long long)y;
```

Cначала произойдёт преобразование типов, а потом отрицание\. После операции все старшие биты будут равны единице\. Рассмотрим, как изменится пример выше при данном порядке вычислений:

![V784_ru/image2.png](https://import.viva64.com/docx/blog/V784_ru/image2.png)

Анализатор также предупреждает о таком коде:

```cpp
unsigned long long x;
unsigned y;
....
x &= y;
```

Несмотря на то, что здесь не используются дополнительные операции, этот код всё равно выглядит подозрительно\. Следует явно преобразовать типы, чтобы поведение когда было более очевидным, как для анализатора, так и для ваших коллег\.