Если операция включает два операнда, верификация принимает, что, прежде чем операция происходит, операнды могут подвергнуться неявному преобразованию типа данных. Происходит ли это преобразование, зависит от исходных типов данных операндов.
Следующее является правилами преобразования, которые применяются, если операнды в бинарной операции имеют совпадающий тип данных. Оба операнда могут быть преобразованы в 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); }