LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Знак при том, что у unsigned-а переполнение нормальное, а у signed-а мало того что портит число неинтуитивным способом, так ещё и при неудачных опциях компилятора портит код вообще.

signed помогает тем, что компилятор сразу вычеркивает варианты с переполнением,

Это не помощь, это вредительство наоборот. Если ты хочешь найти переполнение, соответствующий код вырезать нельзя.

Для unsigned например можно писать так:

x += 10;
if(x<10) goto err;

Для знаковых проверку придётся мало того что в несколько раз усложнить, так ещё и придётся, кроме неудобства знаковых чисел, учитывать ещё и потенциальное вредительство компилятора, могущего эту проверку частично или полностью вырезать на основании «переполнения быть не может» (если забудешь -fno-strict-overflow).

В итоге она будет выглядеть, например, так:

int x;
if(x<0) x += 10;
else {
  x = (int)(((unsigned int)x) + 10);
  if(x<10) goto err;
}
И это при том, что у нас тут слагаемое 10 указано в явном виде (а не в переменной), и мы точно знаем, что оно влезает в x. Если же это не так, всё становится ещё хуже (а с unsigned остаётся всё тот же максимально простой код).

Исправление firkax, :

Знак при том, что у unsigned-а переполнение нормальное, а у signed-а мало того что портит число неинтуитивным способом, так ещё и при неудачных опциях компилятора портит код вообще.

signed помогает тем, что компилятор сразу вычеркивает варианты с переполнением,

Это не помощь, это вредительство наоборот. Если ты хочешь найти переполнение, соответствующий код вырезать нельзя.

Для unsigned например можно писать так:

x += 10;
if(x<10) goto err;

Для знаковых проверку придётся мало того что в несколько раз усложнить, так ещё и придётся, кроме неудобства знаковых чисел, учитывать ещё и потенциальное вредительство компилятора, могущего эту проверку частично или полностью вырезать на основании «переполнения быть не может» (если забудешь -fno-strict-overflow).

Исходная версия firkax, :

Знак при том, что у unsigned-а переполнение нормальное, а у signed-а мало того что портит число неинтуитивным способом, так ещё и при неудачных опциях компилятора портит код вообще.

signed помогает тем, что компилятор сразу вычеркивает варианты с переполнением,

Это не помощь, это вредительство наоборот. Если ты хочешь найти переполнение, соответствующий код вырезать нельзя.

Для unsigned например можно писать так:

x += 10;
if(x<10) goto err;

Для знаковых проверку придётся в несколько раз усложнить, и её всё равно может вырезать компилятор из-за комитетских графоманов.