2015-02-12 3 views
4

тест Вопрос: Что является результатом (false - ~0)(false - NOT (0)) равно 1?

Почему (false - ~0) является 1? На 32-битной машине ~0 есть 11....11, где есть 32 1 бит прямо? Тогда false to int conversion is 00....00 также 32 раза, правильно? Итак, мы вычитаем из 32 ? Это происходит, и мы получаем 1?

+0

std :: map Narek

+0

re @thomasMacleod: ваш вопрос неправильный - вы вычитаете из 32 '0' 32' -1'. –

+0

32 '-1' более гениальный, а затем 'какой тип '-' в этом случае?': D – Narek

ответ

9

0 является int~0 является int и равным -1false получает звание int, что приводит к нулю → ваше выражение вычисляется как (0 - (-1)), которая равна 1.

9

~0 оценивает -1 в представлении-дополнении 2s. Таким образом, 0 - -1 делает равным 1.

Редактировать: Чтобы быть чуть точнее. Унарный оператор ~, примененный к буквальному номеру 0, который является int, является оператором дополнений бит. Затем представление памяти 0 становится 0xffffffff в 32-разрядных архитектурах. Однако результатом остается тип int. Так как все популярные компиляторы интерпретируют представление памяти int в двух дополнениях, ~0 оценивает -1.

+0

Держится до тех пор, пока мы считаем, что она подписана. Но если мы определяем ~ 0 как 'unsigned int', он дает 1 – Atul

+0

@Atul, в C++ буквальный' 0' является подписанным int. См. 2.14.2.2 стандарта ISO C++. – ThomasMcLeod

+0

Ну, даже если мы сделаем так: 'unsigned int zeros = 0; unsigned int ones = 0xFFFFFFFF; unsigned int answer = zeros-ones, 'still' answer' hold value 1 – Atul

Смежные вопросы