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

 
 
> непонятки с оператором if..else, iar c перескакивает, не проверяя условие
skopus
сообщение Dec 19 2005, 14:59
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



почему то не работает вот такая функция преобразования из дополнительного кода в прямой
после первой строки if сразу летит на return, хотя на вход я подаю число, например 0xD500. У меня это -2.5. То есть число в дополнительном коде. Старший бит - это знак. Поскольку минус, он равен 1.

unsigned int abs_int(int sgnval)
{
if (sgnval&0x8000==0x8000) //если старший бит =1, то число отрицательное, следовательно записано в дополнительном коде
{
sgnval -= 0x0001; //отнять младшую 1

if (sgnval&0x0001==0x0001) sgnval=sgnval&0xFFFE; // 1111 1111 1111 1110
else sgnval=sgnval|0x0001; // 0000 0000 0000 0001
if (sgnval&0x0002==0x0002) sgnval=sgnval&0xFFFD; // 1111 1111 1111 1101
else sgnval=sgnval|0x0002; // 0000 0000 0000 0010
if (sgnval&0x0004==0x0004) sgnval=sgnval&0xFFFB; // 1111 1111 1111 1011
else sgnval=sgnval|0x0004; // 0000 0000 0000 1000
if (sgnval&0x0008==0x0008) sgnval=sgnval&0xFFF7; // 1111 1111 1111 0111
else sgnval=sgnval|0x0008; // 0000 0000 0000 1000

if (sgnval&0x0010==0x0010) sgnval=sgnval&0xFFEF; // 1111 1111 1110 1111
else sgnval=sgnval|0x0010; // 0000 0000 0001 0000
if (sgnval&0x0020==0x0020) sgnval=sgnval&0xFFDF; // 1111 1111 1101 1111
else sgnval=sgnval|0x0020; // 0000 0000 0010 0000
if (sgnval&0x0040==0x0040) sgnval=sgnval&0xFFBF; // 1111 1111 1011 1111
else sgnval=sgnval|0x0040; // 0000 0000 1000 0000
if (sgnval&0x0080==0x0080) sgnval=sgnval&0xFF7F; // 1111 1111 0111 1111
else sgnval=sgnval|0x0080; // 0000 0000 1000 0000

if (sgnval&0x0100==0x0100) sgnval=sgnval&0xFEFF;
else sgnval=sgnval|0x0100;
if (sgnval&0x0200==0x0200) sgnval=sgnval&0xFDFF;
else sgnval=sgnval|0x0200;
if (sgnval&0x0400==0x0400) sgnval=sgnval&0xFBFF;
else sgnval=sgnval|0x0400;
if (sgnval&0x0800==0x0800) sgnval=sgnval&0xF7FF;
else sgnval=sgnval|0x0800;

if (sgnval&0x1000==0x1000) sgnval=sgnval&0xEFFF;
else sgnval=sgnval|0x1000;
if (sgnval&0x2000==0x2000) sgnval=sgnval&0xDFFF;
else sgnval=sgnval|0x2000;
if (sgnval&0x4000==0x4000) sgnval=sgnval&0xBFFF;
else sgnval=sgnval|0x4000;
if (sgnval&0x8000==0x8000) sgnval=sgnval&0x7FFF;
else sgnval=sgnval|0x8000;
}
return sgnval;
}


с чем может быть связано?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
BorisRozentsvaig
сообщение Dec 19 2005, 15:14
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



if (sgnval&0x8000==0x8000) эквивалентно if (sgnval & 0x01) - см. правила приоритета операций,
если хочется достичь требуемого результата, то нужно написать так:
if ((sgnval & 0x8000) == 0x8000)
{
......
}

или, просто:

if (sgnval & 0x8000)
{
......
}
Go to the top of the page
 
+Quote Post
Виктория
сообщение Dec 19 2005, 15:59
Сообщение #3


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



И еще в догонку - зачем так длинно?
unsigned abs_int(int sgn_val)
{ return(0xFFFFFL-sgn_val)); }

или уж так
unsigned abs_int(int sgn_val)
{ long v=0xfffffL;
v-=sgn_val;
return((unsigned)v);
}
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение Dec 20 2005, 08:18
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Так, конечно, правильнее. Только тогда уж неплохо было бы "inline" добавть :-)
Go to the top of the page
 
+Quote Post

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

 


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


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