2013-04-20 3 views
-3

Вот операция поразрядного на отрицательное число:побитовое на отрицательных чисел

#include <stdio.h> 

main() 
{ 
    int a = -20, b = 84; 
    printf("%d", (a>>(a &b))); 
} 

двоичное дополнение -20 в бинарное 1100 и 84 10000100. Таким образом, a & b должен быть 100, но ответ 68, а общий ответ -2.

Может кто-нибудь объяснить это мне?

ответ

3

Если вы используете Windows, он должен поставляться с калькулятором, поддерживающим двоичный файл. Это хороший надежный источник для расчетов. Таким образом, вы можете выбрать Word который является ИН.

Negitive номера отмечены в памяти всех битов на левой стороне быть 1. так -20 является

1111-1111-1110-1100 
= 0xFFEC 

И 84:

0000-0000-0101-0100 
= 0x0054 

И это операция поразрядного, которая сравнивает два прошедших номера проверяют каждый бит. Если оба бита равны 1, результирующий бит равен 1. В противном случае он равен нулю. Так

1111-1111-1110-1100 
& 0000-0000-0101-0100 
= 0000-0000-0100-0100 
= 68 
4

-20 не 1100 . Скорее всего (если ints 32-бит, и мы не говорим о нечетных платформах), 11111111111111111111111111101100 .

84 не 10000100 . Это 1010100 .

операция AND их вместе:

11111111111111111111111111101100 
& 
00000000000000000000000001010100 
= 
00000000000000000000000001000100 (68 decimal) 

И тогда вы сдвигая -20 правый 68 позиций, которые есть 2 проблемы:

  • правые сдвиги отрицательных чисел определяется реализацией, что ваш составителя реализация?
  • сдвиги по количеству битов в значении или более, чем в результате этого неопределенного поведения

128-битных Интс вряд ли на общих платформах. 64-битные ints редки, но не невозможны, но для них 68> = 64 и поэтому вы должны получать неопределенное поведение.

Теперь, что это неопределенное поведение может выглядеть ...

Если наши Интс являются 32-разрядными, и мы делаем это на платформе x86 (или что-то подобное) достаточно, 68 должны получить отсекается CPU до 5 бит, оставив вас с графом сдвига 68 & 31 = 4.

И затем, принимая SAR инструкцию (знак сохраняющих арифметический сдвиг вправо) используется для >>, мы получаем (-20) SAR 4 = -2:

11111111111111111111111111101100 
SAR 
4 
= 
11111111111111111111111111111110 (-2 decimal) 
Смежные вопросы