Я хочу передать версию измененного знака некоторого значения в функцию. Я знаю, как проверить переполнение, если знак меняется, но я не знаю об этом одном случае.
int apple( int );
int a = 0;
apple( -a );
Это определенное поведение охватывается стандартом C / C ++? Я передаю -0, я бы предположил, когда == 0. Как насчет использования что-то вроде этого: a ? -a : a
? Спасибо
-a
для случая a == 0
хорошо определено. Стандарт требует, чтобы он все еще был нулевым.
Это не гарантирует, что «биты» в значении не изменятся (они предназначены для дополнения до двух, но не для дополнения до единицы, в этом случае значение равно «отрицательный ноль», какой бы ни была битовая комбинация этого значения). Но значение должно быть истинным для if (!x)
или же if (x == 0)
, даже если x
имеет значение «отрицательный ноль» — это зависит от производителя компилятора и / или процессора, чтобы убедиться, что он работает.
Отрицание целого числа значением 0
доходность 0
, Там нет необходимости какой-либо специальной обработки.
Как в математике, в C ++ -0 == 0
,
Хотя реализация может использовать свои дополнения (и, следовательно, могут быть битовые комбинации как для 0, так и для -0), это не меняет имея в виду значения и любые дополнительные вычисления, необходимые для обработки конкретного -0
case будет простой деталью реализации и будет полностью прозрачным для вас как для программиста.
Нет отрицательного 0 с целочисленными типами. Отрицание 0 приводит к 0. Нет необходимости избегать отрицания.