|
Тип данных в Кейле |
|
|
|
Jun 10 2011, 05:18
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
подскажите начинающему, к какому типу данных правильно отнести число 900 . Дело в том что кейл одинаково отрабатывает и "uint" и "uchar" с подобным числом и в железе все работает правильно, хотя , если я не ошибаюсь, это двухбайтовая величина и должна быть типа "short"
|
|
|
|
|
Jun 10 2011, 06:10
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
поясню вопрос: с термометра ds18b20 считываются два байта данных о температуре, после мат обработки отсеивается часть данных(о знаке температуры), оставшаяся часть принимает описанный выше вид и заносится в переменную. Так при объявлении переменной какой тип данных использовать? пс. я считал, что указание типа обязывает компилятор резервировать соответствующее количество ячеек памяти...
|
|
|
|
|
Jun 10 2011, 06:46
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
дополнение к вопросу. фрагмент кода:
tval=tval*(0.625);// return(tval);
после этой операции tval может принимать значение от 000 до 1200, далее идет сравнение с переменной содержащей число из этого диапазона.
извиняюсь, ошибка. Правильно от 0000 до 1200.
|
|
|
|
|
Jun 10 2011, 07:11
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Desntal @ Jun 10 2011, 10:46)  после этой операции tval может принимать значение от 000 до 1200 Вы хотите правильно объявить переменную tval? А, какой диапазон значений этой переменной до этой операции? От 0 до 1920? Тогда - unsigned int... Применять операции с плавающей точкой в МК - очень расточительно. Достаточно привести 0.625 к виду 5/8 (деление на 8 целого = сдвиг вправо на 3), тогда Код tval= (5 * tval) >> 3;
|
|
|
|
|
Jun 10 2011, 10:55
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
да, объяснить на пальцах трудно. может так понятнее:
...
unsigned ??? data tval;//???- это тип данных unsigned ??? data tUstavka; ... tval=tval*0.625; .... if(tval<=tUstavka) ...
сомнение вызвало то, что в описании типов данных в имеющейся литературе, размер типа uchar 255, а тип uint зависит от разрядности процессора, в данном случае для С51 8 разрядов, значит тоже 255, но здесь мне говорят что uint больше тысячи, запутали вконец... где истина?
|
|
|
|
|
Jun 10 2011, 11:20
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
Палыч, спасибо, просмотрел файл, теперь все ясно можно смело использовать uint.
|
|
|
|
|
Jun 29 2011, 19:49
|

Местный
  
Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744

|
Цитата(Палыч @ Jun 10 2011, 10:11)  Вы хотите правильно объявить переменную tval? А, какой диапазон значений этой переменной до этой операции? От 0 до 1920? Тогда - unsigned int... В корне неверно. Если unsigned int умножать на 0,625, то в результате всегда будет 0 Потому как (int)0,625 будет 0 Если нужно получать не 0, то нужно использовать float (или double, если нужно, и если оно поддерживается) Цитата(Палыч @ Jun 10 2011, 10:11)  Применять операции с плавающей точкой в МК - очень расточительно. Достаточно привести 0.625 к виду 5/8 (деление на 8 целого = сдвиг вправо на 3), тогда Код tval= (5 * tval) >> 3; Это правильно, без особой необходимости лучше плавучку на МК не использовать, здесь вам не тут, это не х86 с сопроцессором, однако. Тем более когда речь идёт об умножении на константу
|
|
|
|
|
Jun 30 2011, 08:59
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(koyodza @ Jun 29 2011, 23:49)  В корне неверно. Если unsigned int умножать на 0,625, то в результате всегда будет 0 Потому как (int)0,625 будет 0 Вот те - раз... В выражении tval=tval*0.625 , где tval целого типа, константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval...
|
|
|
|
|
Jul 11 2011, 20:51
|

Местный
  
Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744

|
Цитата(Палыч @ Jun 30 2011, 11:59)  Вот те - раз... В выражении tval=tval*0.625 , где tval целого типа, константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval... Да, Вы правы, в данном случае происходит неявное приведение к double и обратно. Только вот оно надо? В любом случае подобных конструкций лучше избегать
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|