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

 
 
 
Reply to this topicStart new topic
> Сравнение знаковых и беззнаковых, нюансы какие-то
SasaVitebsk
сообщение Jun 14 2006, 13:41
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Обращаюсь к общественности ещё раз. Что-то я недопонял.

Имеется вот такая строка.
// 607 if((x>XzMin)&&(x<MaxX)&&(y>MinY)&&(y<YzMax))
// 608 OutZnak(x,y,tekcolor,c);
Компилируется в это:
CP R2, R8
CPC R3, R9
BRGE ??ShowActive_33
CP R8, R0
CPC R9, R1
BRCC ??ShowActive_33
CP R20, R10
CPC R21, R11
BRCC ??ShowActive_33
CP R10, R18
CPC R11, R19
BRGE ??ShowActive_33
LDI R21, 35
RCALL ?Subroutine99

Переменные объявлены так:
// 53 __no_init int16_t static XzMin, YzMax; // Для упрощения сравнения
// 448 int16_t x,y;

XzMin =-11 (fff5)
MaxX = 71 (0047)

Если x <0 ну например -5(fff9), то OutZnak не выполняется(-5>71). Что я делаю не так?
Как будто не учитывается знак. Может как-то объявить это надо?
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 14 2006, 17:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Ну, а, по-вашему, как сравнивать знаковую переменную с беззнаковой? Компилятор не может догадаться, что имелось в виду. И, вообще говоря, должен был бы выбросить предупреждение.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 14 2006, 17:16
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ну а что такое int16_t ?
Где описывается MaxX и MinY ?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jun 14 2006, 18:11
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(SasaVitebsk @ Jun 14 2006, 16:41) *
Если x <0 ну например -5(fff9), то OutZnak не выполняется(-5>71). Что я делаю не так?
Как будто не учитывается знак. Может как-то объявить это надо?

Все правильно. Код представления отрицательного числа (дополнительный код) всегда больше кода положительного числа. Поэтому, нужно следить, чтобы данные были со знаком.
А вообще, можно посмотреть "Немного об арифметике". Там как раз размышления на эту тему.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 14 2006, 19:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(GetSmart @ Jun 14 2006, 20:16) *
Ну а что такое int16_t ?
Где описывается MaxX и MinY ?


Что такое отрицательное число в дополнительном коде я знаю. На фронте этому быстро учили. smile.gif

int16_t это обычный integer. А вот за MaxX и MaxY спасибо! smile.gif Действительно не подумал. Объявлены как беззнаковые. Наверное в этом и ошибка.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jun 14 2006, 19:08
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(vet @ Jun 14 2006, 20:06) *
Ну, а, по-вашему, как сравнивать знаковую переменную с беззнаковой? Компилятор не может догадаться, что имелось в виду. И, вообще говоря, должен был бы выбросить предупреждение.

А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны.

Сообщение отредактировал _Bill - Jun 14 2006, 19:09
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 15 2006, 12:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(_Bill @ Jun 14 2006, 22:08) *
Цитата(vet @ Jun 14 2006, 20:06) *

Ну, а, по-вашему, как сравнивать знаковую переменную с беззнаковой? Компилятор не может догадаться, что имелось в виду. И, вообще говоря, должен был бы выбросить предупреждение.

А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны.


Спасибо ребята. Всё это я отлично понимаю. Сравнение должно было быть для знаковых чисел. А вот константы я объявил неверно. Соответственно компилятор сгенерил код. Сейчас всё работает. Тему я не правильно назвал. Просто так проявлялась ошибка.

Большое спасибо GetSmart. Как прочитал, так сразу и понял в чём ошибка.
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 16 2006, 06:08
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(_Bill @ Jun 14 2006, 23:08) *
А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны.

Это неважно. Предупреждение должно иметь место, потому что сравнение знаковой и беззнаковой переменных - явная программистская ошибка. То, что этого не делает IAR, следует отнести к его недостаткам. MSVC, например, делает.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jun 16 2006, 08:15
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(vet @ Jun 16 2006, 09:08) *
Это неважно. Предупреждение должно иметь место, потому что сравнение знаковой и беззнаковой переменных - явная программистская ошибка. То, что этого не делает IAR, следует отнести к его недостаткам. MSVC, например, делает.

IAR тут ни причем. Это стандарт языка. Аналогично, допускается смешение типов в арифметических операциях, например: l = i + f + 0.5; В таких случаях преобразования типов происходято автоматически. Предупреждения выдаются при попытке выполнения операций сравнения чисел без знака с нулем для выявления условий <0, <=0. То, что MSVC выдает предупреждения при сравнении чисел со знаком и без знака, скорее всего, является его плюсом, хотя этого по стандарту языка и не требуется.
Go to the top of the page
 
+Quote Post

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

 


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


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