Преобразование из целого числа без знака требуется для получения правильного арифметического результата (того же числа), по модулю размера целого числа без знака, так сказать. То есть после
int i = anything;
unsigned int u = (unsigned int)i;
и на машине с 32-битными значениями требуется, чтобы u
было равно i
, по модулю 2 32 .
(Мы также можем попытаться сказать, что u
получает значение i % 0x100000000
, за исключением того, что оказывается, что это не совсем правильно, потому что правила C говорят, что когда вы делите отрицательное целое число на положительное целое, вы получаетечастное округляется до 0 и отрицательный остаток, который не является тем модулем, который мы хотим здесь.)
Если i
равен 0 или положителен, нетрудно увидеть, что u
будет иметь то же самоебитовый паттерн. Если i
отрицательно, и , если вы находитесь на машине с комплементом 2, то получается, что результат также гарантированно будет иметь ту же битовую комбинацию. (Я бы хотел представить здесь хорошее доказательство этого результата, но сейчас у меня нет времени, чтобы попытаться его построить.)
Подавляющее большинство современных машин используют дополнение 2. Но если бы вы работали на машине дополнения 1 или знака / величины, я уверен, что битовые комбинации не всегда будут одинаковыми.
Итак, суть в том, что сходство битовых комбинаций равно не гарантируется Стандартом C, но возникает из-за сочетания требований Стандарта C и особенностей арифметики дополнения 2.