﻿# V2568\. MISRA\. Both operands of an operator should be of the same type category\.

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Диагностическое правило актуально только для C\.

Стандарт MISRA C определяет собственную модель типов — [Essential type model](https://pvs-studio.ru/ru/blog/terms/7007/)\.

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

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

**Исключение\.** Левый и правый операнды операторов `+`, `-`, `+=`, `-=` могут иметь сущностные `character` и `signed`/`unsigned` типы соответственно\.

Пример кода, на который анализатор выдаст предупреждения: 

```cpp
enum { A };
int i;
unsigned u;
void foo()
{
  A + u;
  0.f - i;
  A > (_Bool)0;
}
```

Пример корректного кода:

```cpp
void foo(unsigned short x, _Bool b)
{
  x + 1UL;
  if (b && x > 4U) ....
}
```