Каковы общие правила для сравнения различных типов данных в C? - PullRequest
7 голосов
/ 09 июля 2011

Допустим, у меня есть следующие сценарии:

int i = 10;
short s = 5;

if (s == i){
   do stuff...
} else if (s < i) {
  do stuff...
}

Когда в C выполняется сравнение, он преобразует меньший тип данных, в данном случае это кратко int или он преобразует тип данных справа в тип данных слева? В этом случае int к короткому?

Ответы [ 4 ]

11 голосов
/ 09 июля 2011

Это регулируется обычными арифметическими преобразованиями . Для простых случаев общее правило состоит в том, что тип с «меньшей» точностью преобразуется для соответствия типу с «большей» точностью, но он становится несколько сложным, когда вы начинаете смешивать signed и unsigned.

В C99 это описано в разделе 6.3.1.8, который я включил сюда для вашего удобства:

  • Во-первых, если соответствующий действительный тип любого из операндов равен long double, другой операнд преобразуется, без изменения типа домена, в тип, чей соответствующий действительный тип long double.

  • В противном случае, если соответствующий действительный тип любого из операндов равен double, другой операнд преобразуется, без изменения типа домена, в тип, чей соответствующий действительный тип double.

  • В противном случае, если соответствующий действительный тип любого из операндов равен float, другой операнд преобразуется, без изменения типа домена, в тип, чей соответствующий действительный тип float.

  • В противном случае целочисленные преобразования выполняются для обоих операндов. затем следующие правила применяются к повышенные операнды:

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

Я выделил ту часть, которая относится к вашему конкретному примеру.

Понятие целочисленного ранга преобразования определено в разделе 6.3.1.1, и оно в основном описывает то, что вы можете ожидать (типы с меньшей точностью имеют более низкий ранг, чем типы с большей точностью).

5 голосов
/ 09 июля 2011

С Преобразования типов :

Множество неявных преобразований на стр. 44, хотя и неформально, но именно это и нужно запомнить. Их легко запомнить, если вы заметите, что, как говорят авторы, the `lower' type is promoted to the `higher' type,'' where the порядок '' типов равен

char < short int < int < long int < float < double < long double

Это правило легко запомнить - «от низшего к высшему» - но в отношении целочисленных типов со знаком и без знака оно мало помогает, это хорошо объясняется в сообщении Оли. Но это легко запомнить и помогает вам в большинстве случаев.

2 голосов
/ 09 июля 2011

Как правило, C не будет сравнивать два значения, если они не одного типа, и никогда не будет неявно преобразовывать переменную в тип с меньшей точностью. В вашем примере кода short повышен до int, что эквивалентно записи:

int i = 10;
short s = 5;

if ((int)s == i){
   do stuff...
} else if ((int)s < i) {
  do stuff...
}

Это будет именно то, что вы ожидаете, но то же самое нельзя сказать о сравнении со знаком или без знака.

1 голос
/ 10 июля 2011

Типы данных - это своего рода абстракция. Что касается компьютера, то int или short отсутствуют.Есть память и есть данные.

Когда вы говорите int x, вы говорите компьютеру "дайте мне достаточно байтов для хранения целого числа", когда вы говорите short y, вы говорите ... вы догадались.

short, как и следовало ожидать, занимает меньше байтов, чем int и, следовательно, может (и часто содержит) данные в смежных байтах.При сравнении данных разных типов возникает проблема: «Приведут ли соседние биты к искаженным результатам или нет?»

Когда вы сравниваете два разных типа данных, вы действительно сравниваете биты, хранящиеся в двух разных местах.Максимальное количество отдельных битов, сохраняемых для представления данных, должно быть одинакового размера для сравнения для работы

Приведение используется для помощи в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...