Попытка сохранить +129 в символе приводит к сохранению в нем -127. Когда мы пытаемся сохранить +128 в символе, первое число с отрицательной стороны, т. Е. -128, сохраняется. Это связано с тем, что из 9-битного двоичного кода +128, 010000000 сохраняются только самые 8 бит. Но когда 10000000 хранится, самый левый бит равен 1, и он рассматривается как бит знака. Таким образом, значение числа становится -128, так как оно действительно является бинарным (дополнение 2) от -128. В общем случае, если мы превысим диапазон с положительной стороны, мы оказываемся на отрицательной стороне. И наоборот. Если мы превысим диапазон с отрицательной стороны, мы закончим с положительной стороны.
Правило в C ++ заключается в том, что #include <cmath>
помещает объявление abs
в пространство имен std
и позволяет также помещать объявление abs
в глобальное пространство имен. [1112 ]
Другое правило в C ++ состоит в том, что #include <math.h>
помещает объявление abs
в глобальное пространство имен и позволяет также помещать объявление abs
в пространство имен std
. [1113 ]
Итак, нет, вы не можете предположить, что #include <cmath>
не поместит abs
в глобальное пространство имен.
Причина этого правила вместо «очевидного», которое #include <cmath>
помещает имена только в std
, заключается в том, что последнее правило может быть неприятным для реализации, если разработчики C ++ также не имеют контроля над заголовками C , В этом случае заголовки C ++ должны иметь повторяющиеся объявления для всех функций C, и любое изменение заголовков C должно переноситься в заголовки C ++, что создает логистический кошмар.
Вызывая abs
вместо std::abs
, вы просто используете abs из C
Стандарт не запрещает другим пространствам имен иметь функции с именем abs
только потому, что в пространстве имен std
есть функции с именем abs
. Это верно для всех других функций, определенных в пространстве имен std
.
Если вы хотите быть уверены, что используете std::abs
. а не любую другую версию abs
, тогда непременно используйте std::abs
. Тогда неважно, есть ли другие версии abs
, определенные в заголовочном файле windows.h
.