LINUX.ORG.RU

[C] (j>1 && j<-1) равно true

 


0

1
#include <stdio.h>

int main()
{
    unsigned j = 12;
    printf("j > -1: %i\n", j > -1);
    printf("j < -1: %i\n", j < -1);
    printf("j >  1: %i\n", j > 1);
}
j > -1: 0
j < -1: 1
j >  1: 1

Естественно, компилятор ругается на сравнение знакового и беззнакового целых выражений. Но в чём глубинный смысл результата?

Я сначала было подумал, что это из-за представления unsigned. Но после увеличения j на INT_MAX результат не поменялся.

★★★★★
Ответ на: комментарий от Eddy_Em

> Ага, хотя казалось бы, что (unsigned)(-1) должен быть равен INT_MAX+1.

Вот-вот, я тоже так думал.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

>Ага, хотя казалось бы, что (unsigned)(-1) должен быть равен INT_MAX+1.

это с какой логики? ещё «со счётных палочек» 0 - 1 = [F]

yyk ★★★★★
()
Ответ на: комментарий от yyk

С такой логики, что -1 => устанавливаем в 1 знаковый бит + устанавливаем число в 1, получаем 1xxx1, т.е. INT_MAX + 2. Упс. Даже не +1, а +2...

Ну, в общем, вроде бы популярное заблуждение. Правда, при таком идиотском представлении отрицательных чисел арифметические операции пришлось бы делать «задом наперед», т.е. вместо сложения вычитать, а вместо вычитания - складывать.. В общем, уйма геморроя была бы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Ну, в общем, вроде бы популярное заблуждение.

я бы сказал «популярное незнание» :)

Правда, при таком идиотском представлении отрицательных чисел арифметические операции пришлось бы делать «задом наперед»


это очень мягко сказано...

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.