|
|
  |
Сравнение знаковых и беззнаковых, нюансы какие-то |
|
|
|
Jun 14 2006, 13:41
|
Гуру
     
Группа: Свой
Сообщений: 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). Что я делаю не так? Как будто не учитывается знак. Может как-то объявить это надо?
|
|
|
|
|
Jun 14 2006, 18:11
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(SasaVitebsk @ Jun 14 2006, 16:41)  Если x <0 ну например -5(fff9), то OutZnak не выполняется(-5>71). Что я делаю не так? Как будто не учитывается знак. Может как-то объявить это надо? Все правильно. Код представления отрицательного числа (дополнительный код) всегда больше кода положительного числа. Поэтому, нужно следить, чтобы данные были со знаком. А вообще, можно посмотреть "Немного об арифметике". Там как раз размышления на эту тему.
|
|
|
|
|
Jun 14 2006, 19:08
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(vet @ Jun 14 2006, 20:06)  Ну, а, по-вашему, как сравнивать знаковую переменную с беззнаковой? Компилятор не может догадаться, что имелось в виду. И, вообще говоря, должен был бы выбросить предупреждение. А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны.
Сообщение отредактировал _Bill - Jun 14 2006, 19:09
|
|
|
|
|
Jun 15 2006, 12:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_Bill @ Jun 14 2006, 22:08)  Цитата(vet @ Jun 14 2006, 20:06)  Ну, а, по-вашему, как сравнивать знаковую переменную с беззнаковой? Компилятор не может догадаться, что имелось в виду. И, вообще говоря, должен был бы выбросить предупреждение.
А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны. Спасибо ребята. Всё это я отлично понимаю. Сравнение должно было быть для знаковых чисел. А вот константы я объявил неверно. Соответственно компилятор сгенерил код. Сейчас всё работает. Тему я не правильно назвал. Просто так проявлялась ошибка. Большое спасибо GetSmart. Как прочитал, так сразу и понял в чём ошибка.
|
|
|
|
|
Jun 16 2006, 06:08
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(_Bill @ Jun 14 2006, 23:08)  А какие тут могут быть предупреждения? Преобразование типов данных производится автоматически. Компилятор не может "знать" какие именно типы Вам нужны. Это неважно. Предупреждение должно иметь место, потому что сравнение знаковой и беззнаковой переменных - явная программистская ошибка. То, что этого не делает IAR, следует отнести к его недостаткам. MSVC, например, делает.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Jun 16 2006, 08:15
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(vet @ Jun 16 2006, 09:08)  Это неважно. Предупреждение должно иметь место, потому что сравнение знаковой и беззнаковой переменных - явная программистская ошибка. То, что этого не делает IAR, следует отнести к его недостаткам. MSVC, например, делает. IAR тут ни причем. Это стандарт языка. Аналогично, допускается смешение типов в арифметических операциях, например: l = i + f + 0.5; В таких случаях преобразования типов происходято автоматически. Предупреждения выдаются при попытке выполнения операций сравнения чисел без знака с нулем для выявления условий <0, <=0. То, что MSVC выдает предупреждения при сравнении чисел со знаком и без знака, скорее всего, является его плюсом, хотя этого по стандарту языка и не требуется.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|