При кодировании на низкоуровневых языках, таких как CI, обнаруживается, что приведение иногда означает «переосмыслить эти байты, как если бы оно всегда имело этот другой тип», а в других случаях - как «преобразовать это значение разумно в этот другой тип».
Каково первоначальное значение слова и есть ли последовательность в том, когда ожидать преобразования и когда ожидать необработанной реинтерпретации?
terminology
type-casting
Александр Торстлинг
источник
источник
cast
в вычислительном смысле больше похож на отливку в металлургическом смысле, когда форма расплавленного металла преобразуется при заливке в форму: britannica.com/EBchecked/topic/377665/metallurgy/81884/CastingОтветы:
Кастинг в Си уникален, совсем не похож на другие языки. Это также никогда не разумно.
Приведение в C преобразует значения из одного типа в другой, используя тщательно определенные правила. Если вам действительно нужно знать, прочитайте стандарт. В противном случае основные моменты:
Некоторые приведения применяются неявно, а в некоторых из них компилятор выдает предупреждение. Лучше всего прислушаться к предупреждениям!
Словарное определение для приведения лучше игнорировать, поскольку оно бесполезно. Многие приведения лучше описываются терминами преобразования или принуждения, поэтому их тоже стоит знать.
С ++ НАМНОГО сложнее, но ты об этом не спрашивал?
источник
T*
тудаvoid*
и обратно всегда четко определено.Эта часть словаря Вебстера дает правильное определение:
Таким образом, перед приведением в действие ваш «объект» (не буквально объект ООП) имеет заданную форму (тип). Когда вы заново его заливаете, это «заливает бетон» вокруг него, чтобы придать ему новую форму, это то, что вы делаете с заливкой. У вас есть число в виде шестиугольника в виде целого числа, и после приведения вы получите строку в форме прямоугольника.
источник
Может быть полезно разделить приведение C на две группы:
Числовое приведение - конвертируйте число между одним представлением в другое, пытаясь сохранить значение. Например -
(int)3.1
будет3
. Существуют точные правила, определяющие, что происходит, когда точное значение не может быть сохранено.Приведение указателя - сохраните адрес памяти, но измените способ разыменования. Например, for
float x=3.5
,*(int *)&x
даст1080033280
- это целое число представлено тем же битовым шаблоном, который представляет число с плавающей точкой3.5
.источник
Keep the memory address, but change the way it's dereferenced.
Разыменование указателя типа-не определено. Стандарт только гарантирует, что приведениеA *
кB *
и обратно будет производить то же самоеA *
, что, возможно, было недопустимо для разыменования в 1-м месте - или что, еслиB *
этоchar *
, он может использоваться для чтения представления объекта любого типа. Для всех других типовB *
указатель разыменования имеет тип-пробивание, UB и нарушает строгое псевдоним. В любом случае, даже если по этой причине компилятор не испортил вышеприведенный пример 2, вы делаете непереносимые предположения о битовых шаблонахВ C ++ различные типы приведений могут быть сделаны более явными, что
reinterpret_cast
означает «обрабатывать эти байты, как если бы они уже были этим другим». В C вы можете сделать это абсолютно явным, используя aunion
, приведение с(type)
оператором попытается сохранить результат численно эквивалентным, вплоть до потери точности.источник
int*
одно слово, аchar*
двух - слово [со вторым байтом, выбирающим старший или младший байт слова]. Преобразование в(int*)
to(char*)
потребует добавления дополнительного слова, которое должно быть любым значением, которое будет указывать первый байтint
.