Что происходит с типизацией в C? - PullRequest
5 голосов
/ 29 апреля 2020

Я понимаю, что типизация в C делает на высоком уровне. Я понимаю, что иногда это делается неявно, а иногда требуется сделать явно. Однако я не знаю, как это происходит на низком уровне:

Предположим, что GetSignal возвращает тип enum.

 uint8 outValue;
 f32_t iValue;
 iValue = (f32_t)GetSignal();
 outValue = (uint8)((i32_t)iValue);

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

1 Ответ

4 голосов
/ 29 апреля 2020

Что делает приведение типов, так это преобразовывает значение одного типа в значение другого типа. То, что представление этого значения для каждого данного типа зависит от типа.

Предположим, GetSignal возвращает перечисление с базовым значением 1. В качестве 32-разрядного целого числа его представление выглядит следующим образом (при условии байтового порядка байтов с прямым порядком байтов, то есть от высокого к низкому):

00000000 00000000 00000000 00000001

Это целочисленное значение 1 затем преобразуется через явное приведение к f32_t. Предполагая, что этот тип представлен как значение с плавающей точкой одинарной точности IEEE 754, его представление (от высокого к низкому) выглядит следующим образом:

00111111 10000000 00000000 00000000

И это представление сохраняется в iValue.

Затем iValue преобразуется в i32_t. Таким образом, значение float 1 с приведенным выше представлением IEEE754 с плавающей запятой преобразуется в значение int 1 с этим представлением:

00000000 00000000 00000000 00000001

То же, что и возвращенное GetSignal. Это значение затем приводится к типу uint8, который имеет это представление:

00000001

И это представление сохраняется в outValue.

Что касается вашего комментария о добавлении float и правила int, обычная арифметика c преобразование предписывают, что значение с типом int сначала неявно преобразуется в тип float, затем можно добавить два значения float и результат имеет тип float.

...