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

 
 
> Type conversions в CodeVision, unsigned char->float
Gogan
сообщение Dec 28 2007, 13:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 25-10-07
Из: Киев
Пользователь №: 31 728



Есть вот такой проргамный код для АВР(например):

unsigned char a = 100;
float b = 20;

далее в программе

if( b < -a ){...}

так вот оказывается, в таком случаее условие выполняется.
Если кастовать вот так :

if( b < - (int) a ) {...}

тогда все ок. Объясните почему? Я не могу понять, что с чем сравнивается, если не кастовать, и почему так происходит?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergik_vrn
сообщение Dec 28 2007, 14:33
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Gogan @ Dec 28 2007, 16:21) *
Есть вот такой проргамный код для АВР(например):

unsigned char a = 100;
float b = 20;

далее в программе

if( b < -a ){...}

так вот оказывается, в таком случаее условие выполняется.
Если кастовать вот так :

if( b < - (int) a ) {...}

тогда все ок. Объясните почему? Я не могу понять, что с чем сравнивается, если не кастовать, и почему так происходит?

так происходит потому, что тип переменной а unsigned. отрицание вовсе не меняет этот тип, а просто устанавливает старший бит (получается 100 + 128 = 228), после чего производится беззнаковое сравенине. если Вы будете приводить а к типу unsigned int, будет то же самое
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 28 2007, 15:15
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sergik_vrn @ Dec 28 2007, 17:33) *
так происходит потому, что тип переменной а unsigned. отрицание вовсе не меняет этот тип, а просто устанавливает старший бит (получается 100 + 128 = 228), после чего производится беззнаковое сравенине. если Вы будете приводить а к типу unsigned int, будет то же самое

Логика почти правильная, за исключением "просто устанавливает старший бит". На самом деле делается честное преобразование 100 0x64 в (-100) 0x9C, но т.к. это unsigned char, то 0x9C трактуется как положительное число 156. 20 < 156 ? - да.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Gogan   Type conversions в CodeVision   Dec 28 2007, 13:21
- - Kuzmi4   2 Gogan - последний вариант - как бы правильней - ...   Dec 28 2007, 13:25
|- - sergik_vrn   Цитата(defunct @ Dec 28 2007, 18:15) Логи...   Dec 29 2007, 06:54
- - Gogan   Огромное спасибо за ответы! Теперь уяснил. Сег...   Dec 28 2007, 18:33
- - ReAl   Цитата(Gogan @ Dec 28 2007, 15:21) unsign...   Dec 28 2007, 20:57
|- - Gogan   Цитата(ReAl @ Dec 28 2007, 22:57) А то, ч...   Dec 29 2007, 06:25
|- - Палыч   Цитата(ReAl @ Dec 28 2007, 23:57) Приведе...   Dec 29 2007, 08:38
|- - ReAl   Цитата(Палыч @ Dec 29 2007, 10:38) ISO989...   Dec 29 2007, 09:15
- - WHALE   Выбрось каку!!! Обьясните тупому,плиз...   Dec 29 2007, 06:25
- - Qwertty   Имхо правильный вариант: eeprom unsigned int edata...   Dec 29 2007, 06:47
- - WHALE   Дык я про это и пишу.В вашем примере это несомненн...   Dec 29 2007, 07:15
|- - sergik_vrn   Цитата(WHALE @ Dec 29 2007, 10:15) [..] а...   Dec 29 2007, 08:21
- - WHALE   То есть если у меня сложная составная операция с д...   Dec 29 2007, 08:29
- - sergik_vrn   Цитата(WHALE @ Dec 29 2007, 11:29) То ест...   Dec 29 2007, 08:39


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:31
Рейтинг@Mail.ru


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