Тип возвращаемого значения арифметического оператора

#c

#c

Вопрос:

 int main(int argc, char **argv)
{
    unsigned char a = 10, b = 100;
    std::cout<<sizeof(a-b)<<endl;
    return 1;
}
  

Вывод: 4

Какой тип возвращаемых данных?

Комментарии:

1. Разве 4 не является разницей в количестве битов, необходимых для представления 100 и 10, т. е. 6 и 2?

2. @DumbCoder: Я думаю, для вас было бы полезно, если бы вы опубликовали это в виде вопроса.

Ответ №1:

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

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

Комментарии:

1. Разве они не повышены до unsigned int ‘s?

2. @Джеймс: Это часть стандарта?

3. @Jacob: Да. Правила приведены в начале раздела 5 («Выражения») в стандарте языка C . Правила те же, что описаны в MSDN (ну, MSDN добавляет long long к списку, которого нет в C 03, но есть в C 0x).

4. 1. И на платформах, где sizeof(char) == sizeof(int) (не то чтобы я когда-либо работал на одной …), это вычисление продвинуло бы его до unsigned int . Для 16-битных блоков с 16bit int вам придется unsigned short получить повышение до unsigned int аналогично (не то чтобы я когда-либо работал над одним из них).

5. Можете ли вы указать, в каком разделе пункта 5? Это обсуждалось на прошлой неделе, но мы не смогли найти ничего, что гарантировало бы продвижение в int.