Что кастинг делает на уровне компилятора/машины?

Вы можете использовать словарное понимание, если это то, что вы имели в виду.

print({setting.name : setting.active for feature in features for setting in feature.settings.all()})

Если строка становится слишком длинной, вы можете использовать что-то вроде этого.

print({
    setting.name : setting.active
    for feature in features
    for setting in feature.settings.all()
})
8
задан John Topley 24 March 2009 в 09:02
поделиться

7 ответов

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

Если бросок не возможен во время компиляции из-за несовместимых типов, ошибка выпущена. Если бросок не возможен во времени выполнения, исключение выдается.

Страница Wiki на преобразовании типов имеет дополнительную информацию.

6
ответ дан 5 December 2019 в 12:13
поделиться

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

1) Проверьте, является ли ссылка нулевой - если так, выход. 2) Следуйте за ссылкой для нахождения объекта в памяти. В объектном заголовке существует информация, говорящая, каков тип. 3) От информации о типе проверьте, является ли целевой тип в иерархии. Если это не, бросок a ClassCastException с соответствующей информацией.

"Биты" результата всегда являются тем же как "битами" входа (предполагающий, что существует вывод, а не исключение), но затем JVM знает тип ссылки, таким образом, другие операции, как гарантируют, успешно выполнятся.

1
ответ дан 5 December 2019 в 12:13
поделиться

Нужно также понять, как ссылки работают и в компиляции и во время во время выполнения.

Каждый тип содержит справочную таблицу для каждого метода, который разрешает каждый метод к наиболее разрешенному методу для того типа.

Таким образом, если Вашей ссылкой является Объект, звоня toString (), делает правильную вещь и находит наиболее полученный toString () методом. Кастинг необходим, чтобы позволить времени выполнения гарантировать, что любая данная ссылка действительно имеет целевые методы для каждого метода, выставленного на ссылке. После передачи броска от X до Y любую ссылку типа Y можно гарантировать, что все ее методы доступны на литом (SP) ссылка.

1
ответ дан 5 December 2019 в 12:13
поделиться

Это зависит от того, что Вы бросаете. Для числовых бросков, (плавание к интервалу и назад), ЦП попытается найти самое близкое число, которое вписывается в место назначения.

Для случаев типа это ничего не делает к памяти. Это - просто способ для разработчика программного обеспечения сказать глупому компилятору, что некоторую переменную на этот раз нужно рассматривать, как будто это имело другой тип.

Я пытался погуглить некоторую информацию о правилах для числового кастинга, но нет очень вокруг. Можно попробовать стандарт C99, но я не уверен, сокрушит ли он Вас. IIRC, правила:

  • Разрушение (большой тип-> меньший тип как двойной-> плавание-> интервал-> байт) отключит информацию, которая не может быть представлена (так дважды->, плавание потеряет точность,->, интервал потеряет все десятичные разряды + никакое округление).

  • Выбрасывание (меньший тип-> больший тип) означает заполнять дополнительные биты '0'.

Конечно, существуют числа, которые Вы не можете действительно представить (как 0,1). Любая операция на них даже без кастинга потеряет информацию (который является, почему 0.1*10 может быть! = 1.0).

1
ответ дан 5 December 2019 в 12:13
поделиться

В C для не числовые типы, кастинг ничего не делает на 0 и 1 с в памяти.

Для числовых типов компилятор C делает преобразование так, чтобы числовое значение осталось тем же, как можно больше.

Если Вы действительно хотите бросить числовые типы, не изменяя битовые значения, необходимо использовать объединение или бросить указатели (после кода, иллюстрирует последнего):

float a;
int b = 3;

a = *((float*)&b);
2
ответ дан 5 December 2019 в 12:13
поделиться

Другие покрыли основы, но я хотел бы сказать несколько слов о том, как компилятор реализован, который может быть поучительным в его случае.

Компилятор ведет список (названный таблицей символов) имен переменной, используемых в какой-то конкретной точке в программе и некоторой информации о переменных. Список информации включает:

  • их присвоенное устройство хранения данных (в этом регистре, в той ячейке памяти, и т.д....)
  • что вводит, они (т.е. целое число или строка или SubWhatsitObj) включая любое ограничение (как, например, постоянность)
  • любая информация о связи потребности компилятора

Компилятор использует эту информацию, чтобы решить, как рассматривать выражения, включающие переменные. Вид метаинформации, которая хранится в таблице символов, может также быть получен для любого выражения из, он - компоненты.

Кроме особого случая числового преобразования типов, состав исполнителей просто говорит компилятору использовать другую метаинформацию для переменной или выражения, чем обычно имел бы место. Никакие биты в памяти не затронуты вообще, но результат вычисления может быть.

1
ответ дан 5 December 2019 в 12:13
поделиться

Относительно Кастинга полезная литература была бы Спецификацией Виртуальной машины JavaTM.

В разделе Conversions и Promotions Вы видели бы, что существует шесть широких видов преобразований:

  • Преобразования идентификационных данных
  • Расширение примитивных преобразований
  • Сужение примитивных преобразований
  • Расширение ссылочных преобразований
  • Сужение ссылочных преобразований
  • Преобразования строк

Существует пять контекстов преобразования, в которых выражения преобразования могут произойти, включая Преобразование Кастинга:

Контексты кастинга позволяют использование:

  • преобразование идентификационных данных,
  • расширяющееся примитивное преобразование,
  • сужающееся примитивное преобразование,
  • расширяющееся ссылочное преобразование, или
  • сужающееся ссылочное преобразование.

Таким образом преобразования кастинга являются более содержащими, чем преобразования вызова метода или присвоение: бросок может сделать любое разрешенное преобразование кроме преобразования строк.

Кастинг может преобразовать значение любого числового типа к любому другому числовому типу. Значение булевской переменной типа не может быть брошено к другому типу. Значение ссылочного типа не может быть брошено к значению типа примитива.

Некоторые броски могут быть доказаны неправильными во время компиляции и результат в ошибке времени компиляции. Иначе или бросок может быть доказан корректным во время компиляции, или проверка достоверности во время выполнения требуется. (См. Спецификацию языка JavaTM для деталей.)
Если значение во время выполнения является нулевой ссылкой, то броску разрешают. Если проверка в сбоях времени выполнения, ClassCastException брошен.

2
ответ дан 5 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: