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. Нет необходимости избегать отрицания.