signed/unsigned comparison
От: Nikita G  
Дата: 06.08.04 07:11
Оценка:
Объясните каким правилом разруливается ситуация сравнения знаковых/беззнаковых целых в следующем примере:

int i = -1;
unsigned int ui = 10;

if (i < ui)
{
std::cout << "WOW" << std::endl;
}
else
{
std::cout << "BAD" << std::endl;
}

На VC6 SP4 сравнение в данном примере всегда беззнаковое, и результат сравнения всегда false

Спасибо,
Никита
Signed/unsigned comparison
От: Андрей Тарасевич Беларусь  
Дата: 06.08.04 07:18
Оценка: 16 (5)
#Имя: FAQ.cpp.sigunsig
NG>Объясните каким правилом разруливается ситуация сравнения знаковых/беззнаковых целых в следующем примере:

Сравнения знакового и беззнакового делается как беззнаковое. Т.е. знаковое значение приводится к беззнаковому типу.

NG> int i = -1;

NG> unsigned int ui = 10;

NG> if (i < ui)

NG> {
NG> std::cout << "WOW" << std::endl;
NG> }
NG> else
NG> {
NG> std::cout << "BAD" << std::endl;
NG> }

NG>На VC6 SP4 сравнение в данном примере всегда беззнаковое, и результат сравнения всегда false


Разумеется, false. '-1' после приведения к 'unsigned int' в VC6 — это 4294967295, что больше, чем 10.
Best regards,
Андрей Тарасевич
Re[2]: signed/unsigned comparison
От: Шахтер Интернет  
Дата: 06.08.04 18:13
Оценка: 5 (1)
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, Nikita G, Вы писали:


NG>>Объясните каким правилом разруливается ситуация сравнения знаковых/беззнаковых целых в следующем примере:


АТ>Сравнения знакового и беззнакового делается как беззнаковое. Т.е. знаковое значение приводится к беззнаковому типу.


NG>> int i = -1;

NG>> unsigned int ui = 10;

NG>> if (i < ui)

NG>> {
NG>> std::cout << "WOW" << std::endl;
NG>> }
NG>> else
NG>> {
NG>> std::cout << "BAD" << std::endl;
NG>> }

NG>>На VC6 SP4 сравнение в данном примере всегда беззнаковое, и результат сравнения всегда false


АТ>Разумеется, false. '-1' после приведения к 'unsigned int' в VC6 — это 4294967295, что больше, чем 10.


А если вспомнить, что стандарт явно определяет способ такой конверсии как приведение по модулю, то на любой "стандартной" платформе должно получится максимальное значение, представимое в unsigned int, соответсвенно, всегда будет false.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: signed/unsigned comparison
От: achp  
Дата: 06.08.04 19:33
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>А если вспомнить, что стандарт явно определяет способ такой конверсии как приведение по модулю


Где об этом сказано?
Re[4]: signed/unsigned comparison
От: Павел Кузнецов  
Дата: 06.08.04 21:00
Оценка: 5 (1)
achp:

> Ш>А если вспомнить, что стандарт явно определяет способ такой конверсии как приведение по модулю


> Где об этом сказано?


4.7/2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type).


UINT_MAX + 1 в этом смысле конгруентен 0, UINT_MAX + 2 — единице и т.п. Соответственно, в обратную сторону: -1 конгруентен UINT_MAX, -2 — UINT_MAX — 1 и т.п.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.