Неявные преобразования типа данных

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

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

  • Переменные 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.

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

Этот пример показывает неявные преобразования, когда операнды в бинарной операции имеют совпадающий тип данных. Если при запуске верификацию на примерах, можно использовать подсказки на панели Source, чтобы видеть преобразования.

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

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

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;
}

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

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

В этом примере, перед операцией <=, 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);
}