#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.