Мне было очень сложно найти информацию по этому вопросу в том виде, в котором я мог бы легко понять, поэтому я прошу просмотреть то, что я нашел. Все о конверсии и преобразовании.
В примерах я буду иметь в виду:
(signed/unsigned) int bigger;
(signed/unsigned) char smaller;
-
Усечение целых чисел. (Bigger- > меньше)
- сначала усечь
bigger
на стороне MSB, чтобы соответствовать размеруsmaller
. - второй, преобразовать сокращенный результат в подписанный/неподписанный в зависимости от меньшего типа.
Если большее значение слишком велико, чтобы соответствовать меньшему типу, это приводит к поведению undefined (поправьте меня на это). Однако мое правило должно работать на всех машинах (исправить меня тоже), и результаты должны быть предсказуемыми. - сначала усечь
-
Расширение целых чисел (меньше → больше)
a)
signed char
→signed int
- добавить меньше с MSB (1 или 0), чтобы соответствовать большему размеру
- конвертировать в подписанный
b)
signed char
→unsigned int
- добавить меньший размер с MSB (1 или 0), чтобы соответствовать большему размеру.
- конвертировать в unsigned
c)
unsigned char
→signed int
- добавить с 0 для большего размера
- конвертировать в подписанный
d)
unsigned char
→unsigned int
- добавить с 0 для большего размера
- конвертировать в unsigned
Где undefined/неуказанное поведение, о котором я не упоминал, может появиться?