2016-10-10 5 views
1

В приведенном ниже коде,значение с плавающей точкой отливают на символ

#include<stdio.h> 
int main(){ 
    char array[] = {'1', 2, 5.2}; 
    char* my_pointer = array[2]; 
    printf("%c", *my_pointer); 
} 

5.2 хранится в IEEE 754 представления в памяти, char выбирает 8 битов (первый) из этого поплавка представления, из-за маленького формата Endian.

C - свободно типизированный язык. Am разрешено отливать float в char.

Почему программа сбрасывается?

+0

Какой вопрос? – meJustAndrew

+4

Выполняйте действия, которые являются неопределенным поведением, ожидайте, что произойдет неопределенное поведение. –

+0

@DavidHoelzer Я знаю, как '5.2' хранится в памяти, я собираю 8 бит из него. Разве это не определено? C - свободно набранный язык. Мне разрешено использовать 'float' для' char'. Зачем нужно исполняемое ядро? – overexchange

ответ

1

В вашей программе сменить char *my_pointer = array[2]; на char *my_pointer = &array[2]; в качестве указателя следует сохранить адрес.

#include<stdio.h> 
int main(){ 
    char array[] = {'1', 2, 45.2}; 
    char *my_pointer = &array[2]; 
    printf("%c", *my_pointer); 
} 

выход:

- //NOTE: asci value of - is 45 

, как @AnT упомянул в комментариях, при преобразовании 45.2 в char типа, компилятор генерирует код, который загружает 45.2, обрезает значение и сохраняет его в вашем char переменная как 45, поэтому при печати вы получаете - как выход.

+0

Есть ли у вас какие-либо проблемы, если у меня есть несколько типов данных в массиве? Как мы говорим, массив является однородным datamodel – overexchange

+0

, чтобы быть честным @overexchange Я не знаю, поскольку я никогда обычно не использую массивы таким образом. Я придерживаюсь определенного поведения. Вам было бы лучше спросить других :) – Cherubim

+0

«массив - это однородный datamodel», что это значит? В C массив имеет тип, с которым вы его определили. –

1
char* my_pointer = array[2]; 

неправ. RHS этого типа char, а не char*. Повышение уровня предупреждения в вашем компиляторе поможет вам выявить такие проблемы.

С gcc -Wall, я получаю следующее предупреждение:

soc.c: In function ‘main’: 
soc.c:4:23: warning: initialization makes pointer from integer without a cast 
    char* my_pointer = array[2]; 

После этого программа имеет неопределенное поведение.

Что вам нужно:

char* my_pointer = &array[2]; 

или

char* my_pointer = array + 2;