В чем разница между (size_t) -1 и ~ 0? - PullRequest
6 голосов
/ 14 апреля 2019

Я видел (size_t)-1 и ~0, используемые для представления больших чисел, или чисел с перевернутыми битами.

Есть ли разница между этими двумя? Если так, что это?

Я нашел этот вопрос: В чем разница между -1 и ~ 0 , однако он не ответил на мой вопрос, потому что я имею дело с целыми числами без знака (такими как size_t), в отличие в целые числа со знаком (например, int).

Ответы [ 3 ]

6 голосов
/ 14 апреля 2019

В чем разница между (size_t) -1 и ~ 0?

Тип и значение отличаются.

(size_t)-1 соответствует значению SIZE_MAX и имеет тип size_t.

~0 часто равен -1 и имеет тип int.


Назначение обоих из них на size_t приведет к SIZE_MAX.

size_t a = (size_t)-1; 
size_t b = ~0;

Во 2-м случае -1 присваивается b и сначала подвергается преобразованию, оборачиваясь от -1 до максимального значения size_t.

3 голосов
/ 14 апреля 2019

(size_t)-1 относится к типу size_t.Обычно оно имеет значение 2 32 -1 или 2 64 -1 (4294967295 или 18446744073709551615).

~0 имеет тип int, и имеет значение -1 в системе с дополнением 2 (т. Е. Почти везде).

Оба могут иметь одинаковую битовую комбинацию - , если int и size_t имеют одинаковый размер, которым они обычно не являются.

Если вы хотите максимальное значение типа size_t, вы можете использовать макрос SIZE_MAX, определенный в <stdint.h>.Если вы используете более старую реализацию (до C99), которая не обеспечивает SIZE_MAX, (size_t)-1 будет работать.Я не уверен, почему вы хотите написать ~0, а не -1 - если, возможно, вы не рассматриваете системы, не являющиеся дополнением к двум.

2 голосов
/ 14 апреля 2019

Обратите внимание, что в предыдущих ответах использовался механизм дополнения до 2 (очень вероятно, что так и будет в наши дни, но не гарантировано).

Если бы у вас была машина знаковых величин, то -1 имел бы установленный знаковый бит и младший значащий бит со всеми остальными, очищенными, если у вас была машина дополнения 1, тогда у -1 были бы все биты, кроме установленного LSB.

Во всех этих случаях (в том числе на машине с дополнительными 2), ~0 имеет все установленные биты.

...