реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Тип данных в Кейле
Desntal
сообщение Jun 10 2011, 05:18
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



подскажите начинающему, к какому типу данных правильно отнести число 900 . Дело в том что кейл одинаково отрабатывает и "uint" и "uchar" с подобным числом и в железе все работает правильно, хотя , если я не ошибаюсь, это двухбайтовая величина и должна быть типа "short"
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 10 2011, 05:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вы что-то другое хотели спросить, потому что этот вопрос не имеет особого смысла.
Число не имеет типа в языке Си. Тип имеет выражение, к выражениям относятся и константы. А константу можно написать по-разному. Примеры: 900, 900L, 900UL, (short)900, (char)900. Это всё константы, имеющие разные типы. Причём последняя эквивалентна (char)-124 или (char)132 в зависимости от того, имеет ли знак тип char (это тоже по-разному бывает).
Go to the top of the page
 
+Quote Post
Desntal
сообщение Jun 10 2011, 06:10
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



поясню вопрос: с термометра ds18b20 считываются два байта данных о температуре, после мат обработки отсеивается часть данных(о знаке температуры), оставшаяся часть принимает описанный выше вид и заносится в переменную. Так при объявлении переменной какой тип данных использовать?
пс.
я считал, что указание типа обязывает компилятор резервировать соответствующее количество ячеек памяти...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 06:28
Сообщение #4


Гуру
******

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



Цитата(Desntal @ Jun 10 2011, 10:10) *
какой тип данных использовать?
Для этого нужно знать диапазон возможных значений
Go to the top of the page
 
+Quote Post
Desntal
сообщение Jun 10 2011, 06:46
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



дополнение к вопросу.
фрагмент кода:

tval=tval*(0.625);//
return(tval);

после этой операции tval может принимать значение от 000 до 1200, далее идет сравнение с переменной содержащей число из этого диапазона.

извиняюсь, ошибка. Правильно от 0000 до 1200.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 07:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 10 2011, 07:49
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



По-моему, этот топик просится, чтобы его перенесли в раздел для начинающих.
Go to the top of the page
 
+Quote Post
Desntal
сообщение Jun 10 2011, 10:55
Сообщение #8





Группа: Новичок
Сообщений: 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 больше тысячи, запутали вконец... где истина?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 11:13
Сообщение #9


Гуру
******

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



Цитата(Desntal @ Jun 10 2011, 14:55) *
для С51 8 разрядов
Абсолютно неверно. Можно посмотреть файл limits.h - в нем приведены границы диапазонов значений для разных типов данных.

P.S. А ещё можно посмотреть в документации: файл с51.chm; смотреть "Language Extensions->Data Types"
Go to the top of the page
 
+Quote Post
Desntal
сообщение Jun 10 2011, 11:20
Сообщение #10





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



Палыч, спасибо, просмотрел файл, теперь все ясно можно смело использовать uint.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 11:32
Сообщение #11


Гуру
******

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



А, к моему совету (см. пост #6) по поводу исключения операций с плавающей запятой - не прислушались... Зря.
Go to the top of the page
 
+Quote Post
koyodza
сообщение Jun 29 2011, 19:49
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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 с сопроцессором, однако.
Тем более когда речь идёт об умножении на константу
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 30 2011, 08:59
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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...
Go to the top of the page
 
+Quote Post
koyodza
сообщение Jul 11 2011, 20:51
Сообщение #14


Местный
***

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



Цитата(Палыч @ Jun 30 2011, 11:59) *
Вот те - раз...
В выражении
tval=tval*0.625 , где tval целого типа,
константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval...

Да, Вы правы, в данном случае происходит неявное приведение к double и обратно. Только вот оно надо?

В любом случае подобных конструкций лучше избегать
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2011, 05:42
Сообщение #15


Гуру
******

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



Цитата(koyodza @ Jul 12 2011, 00:51) *
В любом случае подобных конструкций лучше избегать

Совершенно верно. Тем более, что значение 0,625 можно представить в виде "красивой" дроби 5/8, с соответственным упрощением умножения на неё, о чём выше и сказано.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 17:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016