Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 22:53

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 03:46 
Только пришел

Зарегистрирован: 01 июн 2011, 18:28
Сообщения: 18
Добрый вечер

Делал небольшую программку на lpcexpresso (1114), и столкнулся с проблемой такого рода:
Код:
for (i = dataLen - 1; i >= 0; --i)
{
...
}

Этот цикл оказался бесконечным. При достижении i == 0 дальнейший его декремент привел к значению 255, а не -1 как ожидалось. Это нормальное поведение?


Последний раз редактировалось developer 06 фев 2012, 21:10, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 04:27 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Если i обьявили как unsigned то вполне нормально. Ибо числа со знаком( для 8ми бит) идут 0..127.-127.-126...-1 примерно так. Старший бит -является битом знака. И 255 превращаются в -1(или наоборот - смотря как описано).
обьявите signed char i;
И цикл переделайте в for(i = dataLen - 1;i>=0; i-- );

пока не совсем ясно с чем конкретно у вас проблема. Почитайте про цикл for в С.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 04:46 
Только пришел

Зарегистрирован: 01 июн 2011, 18:28
Сообщения: 18
как раз таки объявлен как знаковый
Код:
char i = 0;


Ну проблема то ясна, вместо ожидаемого отрицательного значения -1 я получаю 255, вследствии чего цикл становится бесконечным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 05:32 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Так же не совсем логичен выбор преддекремента. Вы скорее всего потеряете один элемент. сделайте принудительно signed char. Может быть ситуёвина что сам компилятор по дефолту считает char как беззнаковый. В IAR по моему даже есть специальная настройка - считать чар беззнаковым.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 05:54 
Только пришел

Зарегистрирован: 01 июн 2011, 18:28
Сообщения: 18
пост- и преддекремент здесь не причем, а вот явно указать знаковый тип помогло :). Никогда не задумывался над такими вещами. Я работаю в CodeRed, быстрым взглядом просмотрел различные настройки - ничего похожего не нашел.
Ну в целом проблема решена, спасибо за помощь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 12:12 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Я имел ввиду что обычно, цикл использует пост инкремент. Иначе у вас индекс будет уменьшатся на 1 еще до выполнения первой иттерации.
А что до явного указания - просто старайтесь всегда не полагаться на то как компилятор истолкует ваш код. Всегда задавайте нужный тип принудительно. Это позволит потом без труда портировать код под другой компилятор(процессор).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 05 фев 2012, 12:55 
Только пришел

Зарегистрирован: 04 фев 2012, 18:24
Сообщения: 6
Все дело именно в типе переменной i. Логично, что если она беззнакового типа, то условие i<0 никогда не выполнится.
Не знаю как в CodeRed, но в IAR и Visual Studio есть параметр "Plain 'char' is unsigned". Я думаю, она связана с частым представлением сиволов в типе 'char', а таблица ASCII у нас 256-знаковая и символов с отрицательными кодами там нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 06 фев 2012, 12:48 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
balu_dark писал(а):
Я имел ввиду что обычно, цикл использует пост инкремент. Иначе у вас индекс будет уменьшатся на 1 еще до выполнения первой иттерации.
лолшто???
есть мнение, что правильно как раз использовать преддекремент (на практике - без разницы).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 06 фев 2012, 13:23 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Надо будет потрейсить оба варианта :) чисто высказал свое мнение.
Мнение которое есть - оно касается циклов с обратным отсчетом или любых?

Гхм - полистал ради интереса несколько книг по Сям - везде пост инкремент. Ну надо тогда пробовать. Я никогда пред декременты/инкременты в циклах не юзал. Надо потестить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 06 фев 2012, 13:38 
Старожил

Зарегистрирован: 01 июл 2010, 15:30
Сообщения: 473
Откуда: Энгельс
Ink писал(а):
лолшто???
есть мнение, что правильно как раз использовать преддекремент (на практике - без разницы).

На голых Сях пост или преддекремент в цикле for абсолютно идентичны, а вот на плюсах, при использовании итераторов разница есть, оттуда и рекомендация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 06 фев 2012, 13:45 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
neiver писал(а):
Ink писал(а):
лолшто???
есть мнение, что правильно как раз использовать преддекремент (на практике - без разницы).

На голых Сях пост или преддекремент в цикле for абсолютно идентичны, а вот на плюсах, при использовании итераторов разница есть, оттуда и рекомендация.

ну, да, логично. только ведь к циклам это отношения не имеет вообще?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Представление отрицательных чисел и бесконечность
СообщениеДобавлено: 06 фев 2012, 21:14 
Только пришел

Зарегистрирован: 01 июн 2011, 18:28
Сообщения: 18
Та разницы нет что ты будешь юзать в цикле пост или предекремент, проблема оказалась как раз таки в типе char, походу по умолчанию компилятор понимает его как unsigned.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB