если int может содержать все значения исходного типа, то значение преобразуется в int , иначе в unsigned int. Что это значит?

Приведенная выше строка посвящена неявным интегральным преобразованиям/продвижениям в C, взятым из книги Майка БанаханаРаздел 2.8.1.1 (ссылка). Вот какой именно абзац:

C не выполняет никаких арифметических операций с точностью меньше, чем int, поэтому эти преобразования подразумеваются почти всякий раз, когда вы используете в выражении один из объектов, перечисленных ниже. Преобразование определяется следующим образом:

Всякий раз, когда короткое замыкание или символ (или битовое поле или тип перечисления, которые мы еще не встречали) применяются интегральные продвижения

  • если int может содержать все значения исходного типа, то значение преобразуется в int
  • иначе преобразование будет в unsigned int

Вот мои заблуждения по поводу части, выделенной жирным шрифтом. Пожалуйста, очистите это:

  • Не является ли часть «иначе» избыточной? Разве все типы short или char не должны вписываться в int по умолчанию, учитывая, что int больше, чем в размер? Как вообще возникает вопрос о short, не вписывающемся в int и требующем unsigned int?
  • Как действительна часть «иначе»: если отрицательное короткое целое неявно преобразуется в беззнаковое целое, не изменится ли его значение?

Хотя у меня было искушение отбросить это как тривиальное и двигаться дальше, я чувствовал, что получить правильное объяснение было бы лучше. Спасибо.


person Thokchom    schedule 21.09.2014    source источник
comment
Int может содержать все значения типа short, но не обязательно все значения типа unsigned short.   -  person n. 1.8e9-where's-my-share m.    schedule 21.09.2014


Ответы (1)


Тип int (согласно стандарту C) не должен быть больше, чем short. int должен быть только "не короче", чем short. Например, они оба могут быть 16-битными. В этом случае возможно иметь значение unsigned short, которое не может вписаться в int.

(Страница Википедии, посвященная типам данных C, довольно показательна.)

person cjubb39    schedule 21.09.2014
comment
Добавьте ссылку на спецификацию C, чтобы улучшить свой ответ. - person ericbn; 21.09.2014