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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 08:07   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию Сравнение signed и unsigned типов.

Здравствуйте!
Сижу и не могу понять, я что-то не знаю о вышеупомянутой теме или баг в визуал С++:
Код:
#include <iostream>
using namespace std;

int main()
{
	// Комментируем одно из объявлений
	//unsigned short int i(0);  // Выход на первой итерации
	unsigned int i(0);		// Виснем в цикле
	while(true)
	{ 
		if(i > signed char(-1))	
			break;
		++i;
	}
	cout<<"finish\n"<<i;

	int wait; cin>>wait;
	return 0;
}
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 08:42   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

прямого сравнения поидее нет, разного диапазона типы.
а числа больше -1(0xFFFFFFFF), в целочисленном беззнаковом типе как бы нет.

вообще, так делать не стоит.(и это не баг)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 02.04.2013 в 08:45.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.04.2013, 09:00   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
я что-то не знаю о вышеупомянутой теме или
Что больше - 0x00000000 или 0xFFFFFFFF? Платформа 32битная.
waleri вне форума Ответить с цитированием
Старый 02.04.2013, 09:16   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Понятно что типы разные, но на мой взгляд не должно быть разницы при изменении с signed int на signed short, а так не понятно чего ждать от программы.

Цитата:
Сообщение от waleri Посмотреть сообщение
Что больше - 0x00000000 или 0xFFFFFFFF? Платформа 32битная.
Если signed, то первый, unsigned - второй

Последний раз редактировалось Stilet; 02.04.2013 в 17:58.
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 10:15   #5
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
на мой взгляд не должно быть разницы при изменении с signed int на signed short
А теперь вспоминаем, где находится знаковый бит и к чему может привести такое уполовинивание битов.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 02.04.2013, 10:28   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Я считаю, студия виновата, она должна выдать ошибку. Почему получается разный результат, в первом посте? Наверное, потому что в одном случаи левая часть приводится ко второй, а в другом вторая к первой. Другими словами, существует несколько путей сравнения, нормальный компилятор обязан начать ругаться.
П.с: думаю что разобрался, не буду я использовать unsigned. Благодарю за участие.
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 11:24   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Я считаю, студия виновата, она должна выдать ошибку. Почему получается разный результат, в первом посте? Наверное, потому что в одном случаи левая часть приводится ко второй, а в другом вторая к первой. Другими словами, существует несколько путей сравнения, нормальный компилятор обязан начать ругаться.
П.с: думаю что разобрался, не буду я использовать unsigned. Благодарю за участие.
2010 студия выдавала варнинг на тему сравнения.
студия ничего вам не должна, вы должны помнить о хранении типов в памяти и преобразовании оных, а не компиль думать за вас.

поясните что за разные результаты?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.04.2013, 11:36   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Я считаю, студия виновата, она должна выдать ошибку. Почему получается разный результат, в первом посте? Наверное, потому что в одном случаи левая часть приводится ко второй, а в другом вторая к первой. Другими словами, существует несколько путей сравнения, нормальный компилятор обязан начать ругаться.
По идее, при уровне предупреждений -Wall предупреждение-то должно выдаваться. Но это не ошибка - формально код корректный, стандартом не запрещён. А то, что он ведёт себя не так, как ожидает программист - так это, извините, проблемы программиста.
Abstraction вне форума Ответить с цитированием
Старый 02.04.2013, 11:40   #9
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Чтобы понять меня, думаю надо скомпилить это в студии:
Код:
#include <iostream>
using namespace std;

int main()
{
	typedef unsigned int type_1;
	typedef unsigned short type_2;

	if(type_1(1) > - 1)
		cout<<"type_1\n";
	if(type_2(1) > - 1)
		cout<<"type_2\n";

	int wait;  cin>>wait;
	return 0;
}
cout: type_2

Нет ни одной ошибки, ни одного предупреждения. В процессе typedef может поменять тип, на который он будет указывать, т.е. простор для потенциальных ошибок.
220Volt вне форума Ответить с цитированием
Старый 02.04.2013, 11:44   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
В процессе typedef может поменять тип, на который он будет указывать
Не может.
Цитата:
т.е. простор для потенциальных ошибок.
Да, сравнение знакового и беззнакового типа - потенциальная ошибка. Как уже сказано, это предупреждение в большинстве компиляторов. Если Ваш компилятор предупреждения не выдаёт, убедитесь, что включён максимальный уровень проверки.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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