История изменений
Исправление 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;
}
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;
Для знаковых проверку придётся в несколько раз усложнить, и её всё равно может вырезать компилятор из-за комитетских графоманов.