﻿# V103\. Implicit type conversion from memsize type to 32\-bit type\.


> Это правило входит в группу "Диагностика 64\\\-битных ошибок"\\\. Разработка правил этой группы больше не ведётся, и в будущем они могут быть отключены\\\. Если вы используете эти правила, \[свяжитесь с нашей поддержкой\]\(https://pvs\-studio\.ru/ru/about\-feedback/\) — мы поможем найти замену или предложим альтернативное решение\\\.

Анализатор обнаружил потенциально возможную ошибку, связанную с неявным приведением memsize типа к 32\-битному типу\. Ошибка заключается в потере старших бит в 64\-битном типе, что влечет потерю значения\. Компилятор также диагностирует подобные приведения типов и выдает предупреждения\. К сожалению, часто подобные предупреждения отключают, особенно когда в проекте присутствует много старого унаследованного кода или используются старые библиотеки\. Чтобы не заставлять программиста просматривать сотни и тысячи подобных предупреждений, выдаваемых компилятором, анализатор информирует только о тех из них, которые могут быть причиной некорректной работы кода на 64\-битной платформе\.

Первый пример\.

Наше приложение работает с видеоизображениями, и мы хотим посчитать, какой размер файла нам потребуется, чтобы сохранить все кадры, находящиеся в памяти, в файл\.

```cpp
size_t Width, Height, FrameCount;
...
unsigned BufferSizeForWrite = Width * Height * FrameCount * 
  sizeof(RGBStruct);
```

Раньше общий объем видеокадров в памяти никогда не мог превышать 4 Гб \(на практике 2\-3 Гб, в зависимости от разновидности ОС Windows\)\. На 64\-битной платформе мы получили возможность хранить в памяти намного больше кадров, и предположим, что их общий объем составляет 10 Гб\. В результате при помещении результата выражения "Width \* Height \* FrameCount \* sizeof\(RGBStruct\)" в переменную 'BufferSizeForWrite', мы отбросим старшие биты и будем работать с некорректным значением\.

Правильным решением будет замена типа переменной 'BufferSizeForWrite' на тип 'size\_t'\.

```cpp
size_t Width, Height, FrameCount;
...
size_t BufferSizeForWrite = Width * Height * FrameCount * 
  sizeof(RGBStruct);
```

Второй пример\.

Сохранение в 32\-битном типе результата вычитания одного указателя из другого\.

```cpp
char *ptr_1, *ptr_2;
...
int diff = ptr_2 -  ptr_1;
```

Если указатели различаются более чем на 'INT\_MAX' байт \(2 Гб\), то произойдет обрезание значения при присваивании\. В результате переменная 'diff' будет иметь некорректное значение\. Для хранения полученного значения следует использовать тип 'ptrdiff\_t' или другой memsize тип\.

```cpp
char *ptr_1, *ptr_2;
...
ptrdiff_t diff = ptr_2 -  ptr_1;
```

В тех случаях, когда вы точно уверены в корректности кода, и [неявное приведение типа](https://pvs-studio.ru/ru/blog/terms/0021/) не влечет ошибок при переходе на 64\-битную архитектуру, вы можете использовать [явное приведение типа](https://pvs-studio.ru/ru/blog/terms/0015/) для того, чтобы избежать вывода диагностических сообщений в этой строке\. Пример:

```cpp
unsigned BitCount = static_cast<unsigned>(sizeof(RGBStruct) * 8);
```

В том случае, если вы подозреваете наличие в своем коде некорректных явных приведений memsize типов к 32\-битным типам, на которые анализатор не выдает предупреждения, то вы можете воспользоваться правилом [V202](https://pvs-studio.ru/ru/docs/warnings/v202/)\.

Как было сказано ранее, анализатор информирует только о тех приведениях типов, которые могут быть причиной некорректной работы кода на 64\-битной платформе\. Приведенный ниже код не будет диагностироваться как ошибочный, хотя в нем происходит приведение memsize типов к типу int:

```cpp
int size = sizeof(float);
```

Дополнительные материалы по данной теме:

1. 64\-битные уроки\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.