Попытка понять, как приведение / преобразование выполняется компилятором, например, при приведении из float к int. - PullRequest
0 голосов
/ 09 июля 2010

Когда float приводится к int, то как это приведение осуществляется компилятором. Маскирует ли компилятор некоторую часть памяти переменной с плавающей запятой, т. Е. Какая часть памяти вставляется компилятором, чтобы передать оставшуюся переменную int.

Полагаю, ответ на этот вопрос заключается в том, как int и float сохраняются в памяти.

Но не зависит ли это от машины, а не от компилятора. Как компилятор решает, какую часть памяти копировать при приведении к более низкому типу (это статическое приведение, верно).

Наверное, меня смущает какая-то неверная информация.

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

... Спасибо

Ответы [ 2 ]

0 голосов
/ 09 июля 2010

Большинство архитектур ЦП предоставляют встроенную инструкцию (или последовательность из нескольких инструкций) для преобразования с плавающей точкой <-> int. Компилятор обычно просто генерирует эту инструкцию. Там часто более быстрые методы. Этот вопрос содержит несколько полезных сведений: Какой самый быстрый способ преобразования числа с плавающей точкой в ​​int на x86 .

0 голосов
/ 09 июля 2010

Когда речь идет об основных типах, а не указателях, тогда выполняется преобразование. Поскольку представления с плавающей запятой и целые числа сильно различаются (обычно IEEE-754 и два дополняют соответственно), это больше, чем просто маскировка некоторых бит.

Если вы хотите увидеть число с плавающей запятой, представленное в виде целого числа, без выполнения преобразования, вы можете сделать что-то вроде этого (в C):

float f = 10.5;
int i2 = (int*)&f;
printf("%f %d\n", f, i2);
...