C и C++ могут работать на разных архитектурах и типах машин. Следовательно, у них могут быть разные представления чисел: дополнение к двум, а дополнение Оней - наиболее распространенное. В общем, вы не должны полагаться на определенное представление в своей программе.
Для целочисленных типов без знака (size_t
, являющихся одним из них), стандарт C (и, как мне кажется, стандарт C++) определяет точные правила переполнения. Короче говоря, если SIZE_MAX
максимальное значение типа size_t
, то выражение
(size_t) (SIZE_MAX + 1)
гарантированно будет 0
, и, следовательно, вы можете быть уверены, что (size_t) -1
равно SIZE_MAX
. То же самое справедливо и для других неподписанных типов.
Обратите внимание, что выше справедливо:
- для всех неподписанных типов,
- даже если базовая машина не представляет числа в дополнительном двоичном. В этом случае компилятор должен убедиться, что идентификатор имеет значение true.
Кроме того, вышеуказанные средства, что вы не можете полагаться на конкретных представлений для подписали типов.
Edit: Для того, чтобы ответить на некоторые из комментариев:
Допустим, у нас есть фрагмент кода, как:
int i = -1;
long j = i;
Существует преобразование типов в присвоении j
. Предполагая, что int
и long
имеют разные размеры (большинство [все?] 64-битные системы), битовые шаблоны в ячейках памяти для i
и j
будут отличаться, потому что они имеют разные размеры. Компилятор гарантирует, что значения из i
и j
- -1
.
Точно так же, когда мы делаем:
size_t s = (size_t) -1
Существует преобразование типов происходит. -1
имеет тип int
. У этого есть бит-шаблон, но это не имеет значения для этого примера, потому что, когда преобразование в size_t
происходит из-за броска, компилятор будет переводить значение в соответствии с правилами для типа (size_t
в этом случае). Таким образом, даже если int
и size_t
имеют разные размеры, стандарт гарантирует, что значение, сохраненное в s
выше, будет максимальным значением, которое может принять size_t
.
Если мы делаем:
long j = LONG_MAX;
int i = j;
Если LONG_MAX
больше INT_MAX
, то значение в i
определяется реализацией (C89, раздел 3.2.1.2).
Читайте о дополнении «Два дополнения» в Википедии; это самый распространенный способ кодирования отрицательных чисел в двоичном формате. – Artelius
http://en.wikipedia.org/wiki/Two%27s_complement – 2009-12-07 21:50:48
Вы заметите, что, как и без знаковых чисел, добавление 1 к максимально возможному числу даст вам минимально возможное число. –