Объясните каким правилом разруливается ситуация сравнения знаковых/беззнаковых целых в следующем примере:
int i = -1;
unsigned int ui = 10;
if (i < ui)
{
std::cout << "WOW" << std::endl;
}
else
{
std::cout << "BAD" << std::endl;
}
На VC6 SP4 сравнение в данном примере всегда беззнаковое, и результат сравнения всегда false
Спасибо,
Никита
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.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, 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 >>
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен