C и C ++ могут работать на многих разных архитектурах и типах машин. Следовательно, они могут иметь различное представление чисел: два дополнения и одно дополнение являются наиболее распространенными. В общем, вы не должны полагаться на конкретное представление в вашей программе.
Для беззнаковых целочисленных типов (size_t
является одним из них) стандарт C (и, я думаю, стандарт C ++ тоже) определяет точные правила переполнения. Короче говоря, если SIZE_MAX
- максимальное значение типа size_t
, то выражение
(size_t) (SIZE_MAX + 1)
гарантированно будет 0
, и поэтому вы можете быть уверены, что (size_t) -1
равно SIZE_MAX
. То же самое верно и для других беззнаковых типов.
Обратите внимание, что вышесказанное верно:
- для всех беззнаковых типов,
- даже если базовая машина не представляет числа в дополнении до двух. В этом случае компилятор должен убедиться, что идентичность верна.
Кроме того, вышеизложенное означает, что вы не можете полагаться на определенные представления для подписанных типов.
Изменить: чтобы ответить на некоторые комментарии:
Допустим, у нас есть такой фрагмент кода:
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
.
If we do:
long j = LONG_MAX;
int i = j;
Если LONG_MAX
больше INT_MAX
, тогда значение в i
определяется реализацией (C89, раздел 3.2.1.2).
person
Alok Singhal
schedule
07.12.2009
0xFFFFFFFF
. - person David Schwartz   schedule 24.07.2015