C/C++ Отрицание переменной целочисленного типа со значением 0

Я хочу передать версию измененного знака некоторого значения в функцию. Я знаю, как проверить переполнение, если знак меняется, но я не знаю об этом одном случае.

int apple( int );

int a = 0;

apple( -a );

Это определенное поведение охватывается стандартом C/C++? Я передаю -0, я бы предположил, когда == 0. Как насчет использования что-то вроде этого: a ? -a : a? Спасибо

4 ответа

Решение

-a для случая a == 0 хорошо определено. Стандарт требует, чтобы он все еще был нулевым.

Это не гарантирует, что "биты" в значении не изменятся (они предназначены для дополнения до двух, но не для дополнения к одному, в этом случае значение равно "отрицательный ноль", независимо от того, какая это битовая комбинация). Но значение должно быть истинным для if (!x) или же if (x == 0), даже если x имеет значение "отрицательный ноль" - это зависит от производителя компилятора и / или процессора, чтобы убедиться, что он работает.

Как в математике, в C++ -0 == 0,

Несмотря на то, что реализации разрешено использовать свое дополнение (и, следовательно, могут быть шаблоны битов как для 0, так и для -0), это не меняет смысла значения и любых дополнительных вычислений, необходимых для обработки конкретного -0 case будет простой деталью реализации и будет полностью прозрачен для вас как для программиста.

Отрицание целого числа значением 0 доходность 0, Там нет необходимости какой-либо специальной обработки.

Нет отрицательного 0 с целочисленными типами. Отрицание 0 приводит к 0. Нет необходимости избегать отрицания.

Другие вопросы по тегам