exponenta event banner

Допущения об неявных преобразованиях типов данных

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

Ниже приведены правила преобразования, которые применяются, если операнды в двоичной операции имеют один и тот же тип данных. Оба операнда могут быть преобразованы в int или unsigned int введите до выполнения операции. Это преобразование называется целочисленным продвижением. Правила преобразования основаны на стандарте ANSI ® C99 Standard.

  • char и signed short переменные преобразуются в int переменные.

  • unsigned short переменные преобразуются в int переменные, только если int переменная может представлять все возможные значения unsigned short переменная.

    Для целей, где размер int совпадает с размером short, unsigned short переменные преобразуются в unsigned int переменные. Дополнительные сведения о размерах типов данных см. в разделе Target processor type (-target).

  • Такие типы, как int, long и long long остаются неизменными.

Ниже приведены некоторые правила преобразования, которые применяются, когда операнды имеют различные типы данных. Правила основаны на стандарте ANSI C99.

  • Если оба операнда signed или unsignedоперанд с более низким типом данных преобразуется в тип данных операнда с более высоким типом данных. Ранг увеличивается в ордене char, short, int, long, и long long.

  • Если один операнд unsigned и другой signed, и unsigned тип данных операнда имеет ранг выше или такой же, как signed тип данных операнда, signed операнд преобразуется в unsigned тип операнда.

    Например, если один операнд имеет тип данных int а другой имеет тип unsigned int, int операнд преобразуется в unsigned int.

Неявное преобразование, когда операнды имеют одинаковый тип данных

В этом примере показаны неявные преобразования, когда операнды в двоичной операции имеют один и тот же тип данных. При выполнении проверки на примерах можно использовать подсказки на панели «Источник» для просмотра преобразований.

В первом дополнении, i1 и i2 не преобразуются до добавления. Их сумма может иметь значения, выходящие за пределы диапазона int введите, потому что i1 и i2 имеют значения полного диапазона. Поэтому проверка переполнения при первом добавлении имеет оранжевый цвет.

Во втором дополнении, c1 и c2 повышены до int перед добавлением. Добавление не переполняется, поскольку int переменная может представлять все значения, которые являются результатом суммы двух char переменные. Проверка переполнения при втором добавлении имеет зеленый цвет. Однако, когда сумма назначена char переменная, переполнение происходит во время преобразования из int назад в char. На экране появится оранжевая проверка переполнения = операция.

extern char input_char(void);
extern int input_int(void);

void main(void) {
    char c1 = input_char();
    char c2 = input_char();
    int i1 = input_int();
    int i2 = input_int();
  
    i1 = i1 + i2;
    c1 = c1 + c2;
}

Неявное преобразование, когда операнды имеют различные типы данных

Следующие примеры показывают неявные преобразования, которые происходят, когда операнды в двоичной операции имеют различные типы данных. При выполнении проверки на примерах можно использовать подсказки на панели «Источник» для просмотра преобразований.

В этом примере перед <= работа, x неявно преобразован в unsigned int. Поэтому проверка утверждения пользователя имеет красный цвет.

#include <assert.h>
int func(void) {
    int x = -2;
    unsigned int y = 5;
    assert(x <= y);
}

В этом примере в первом assert заявление, x неявно преобразован в unsigned int перед операцией x <= y. Из-за этого преобразования, во втором assert заявление, x больше или равно нулю. Проверка утверждения пользователя на втором assert оператор имеет зеленый цвет.

int input(void);

void func(void) {
    unsigned int y = 7;
    int x = input();
    assert ( x >= -7 && x <= y );
    assert ( x >=0 && x <= 7);
}