Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 13:46   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ето потому что сравниваются константы.
Если сделать так:
Код:
extern int var;
int test(unsigned int a1, unsigned short a2)
{
	if (a1 > var)
		return 0;
	
	if (a2 > var)
		return 0;

	return 0;
}
то результат уже другой.
waleri вне форума Ответить с цитированием
Старый 02.04.2013, 14:14   #12
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Не может
Под процессом подразумевал процесс разработки программы.
Кстати, пытался компилировать с максимальным уровнем информирования об ошибках, не помогло.

Последний раз редактировалось 220Volt; 02.04.2013 в 14:19.
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 14:35   #13
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Чтобы понять меня, думаю надо скомпилить это в студии:
VS 2010 с -Wall
t.cpp(9) : warning C4287: '>' : unsigned/negative constant mismatch
t.cpp(9) : warning C4127: conditional expression is constant
t.cpp(11) : warning C4127: conditional expression is constant
Somebody вне форума Ответить с цитированием
Старый 02.04.2013, 14:37   #14
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
VS 2010 с -Wall
Как установить Wall?
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 14:38   #15
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ето потому что сравниваются константы.
Если сделать так:
то результат уже другой.
Почему? Всё равно же у int и unsigned общий тип - unsigned, а у int и unsigned short - int.
Somebody вне форума Ответить с цитированием
Старый 02.04.2013, 14:43   #16
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Как установить Wall?
Нашел пробую. Level4 ставил, а Wall не увидел )))

Полезность Wall мягко говоря сомнительна. Да она выдала предупреждение о сравнении signed и unsigned, но и еще 33 предупреждения. И это в коде из 8 строк. И потом найди там нужную информацию ...

Последний раз редактировалось Stilet; 02.04.2013 в 18:01.
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 15:22   #17
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Полезность Wall мягко говоря сомнительна. Да она выдала предупреждение о сравнении signed и unsigned, но и еще 33 предупреждения. И это в коде из 8 строк. И потом найди там нужную информацию ...
Значит, у Вас допущено ещё 33 потенциальных ошибки
Кроме шуток. Читать предупреждения Wall обычно хорошая идея, они не так часто оказываются излишними.
Abstraction вне форума Ответить с цитированием
Старый 02.04.2013, 17:46   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Почему? Всё равно же у int и unsigned общий тип - unsigned, а у int и unsigned short - int.
Я лично не понял это предложение. Можете сказать по другому? Что с чем и почему общее? И почему в одном случае общее одно, в другом случае общее другое?
waleri вне форума Ответить с цитированием
Старый 02.04.2013, 17:48   #19
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Почему? Всё равно же у int и unsigned общий тип - unsigned, а у int и unsigned short - int.
С какого перепугу? unsigned = unsigned int, если что. А int = signed int. А insigned short = unsigned short int, внезапно.

Последний раз редактировалось Abstraction; 02.04.2013 в 17:52.
Abstraction вне форума Ответить с цитированием
Старый 02.04.2013, 22:03   #20
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Тип, к которому приводятся операнды перед сравнением:
http://www.open-std.org/jtc1/sc22/wg...2012/n3337.pdf
5.0.9
Цитата:
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:
— If either operand is of scoped enumeration type (7.2), no conversions are performed; if the other operand does not have the same type, the expression is ill-formed.
— If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float.
— Otherwise, the integral promotions (4.5) shall be performed on both operands. Then the following rules shall be applied to the promoted operands:
— If both operands have the same type, no further conversion is needed.
— Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank shall be converted to the type of the operand with greater rank.
— Otherwise, if the operand that has unsigned integer type has rank greater than or equal to the rank of the type of the other operand, the operand with signed integer type shall be converted to the type of the operand with unsigned integer type.
— Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, the operand with unsigned integer type shall be converted to the type of the operand with signed integer type.
— Otherwise, both operands shall be converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
Можно только добавить, что если, например, int и unsigned short будут оба одного размера, то тогда это уже попадёт под другой пункт (-> unsigned int).

Последний раз редактировалось Somebody; 02.04.2013 в 22:07.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
warning C4018: '<' : signed/unsigned mismatch ? Тёма_) Visual C++ 2 24.07.2012 19:33
Для типов данных char, short, int, long с квалификаторами signed, unsigned составить программу, которая, listiksasha Фриланс 4 21.02.2011 12:26
Для типов данных char, short, int, long с квалификаторами signed, unsigned составить программу, которая, listiksasha Помощь студентам 2 20.02.2011 12:57
Comparing signed and unsigned types - widened both operands Человек_Борща Общие вопросы Delphi 4 09.01.2011 14:59