2016-11-01 4 views
-4

Если я это назначениеРазыменование указателя из другого псевдонима несовместимого типа

float x = 16.8; 
unsigned int i = *(unsigned int*) &x; 

Что будет значение переменной i? Что это за логика этого задания?

+0

Неприменимо поведение, применяется строгое правило сглаживания. –

+0

его целое число, следовательно, не десятичные точки. Также почему бы не протестировать его в компиляторе просто? Будет приводить к UB – amanuel2

+0

Вы должны использовать союз, по-видимому, иначе поведение будет неопределенным. См. [Здесь] (http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) для получения дополнительной информации. –

ответ

1

С кодом, как это, вы могли бы увидеть ответ в вашем точном случае:

#include <stdio.h> 

int main(void) 
{  
    float x = 1; 
    unsigned int i = *(unsigned int*) &x; 
    printf("%d\n", i); 

    return 0; 
} 

Этот тип присвоения является незаконным, литьем указатель на float в указатель на unsigned int, а затем разыгрывать его, вы против Строгое правило сложения.

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

float x = 16; 

Вы, вероятно, не имеют ожидаемого i = 16.

В большинстве случаев ваш код будет казаться правильным, вы не будете предупреждены или что-нибудь еще, и код будет запущен. Так что будьте осторожны!

Смежные вопросы