2014-02-03 3 views
0

У меня есть следующий код в C:битовые операции в C Объяснение

unsigned int a = 60; /* 60 = 0011 1100 */ 
int c = 0; 
c = ~a; /*-61 = 1100 0011 */ 
printf("c = ~a = %d\n", c); 
c = a << 2; /* 240 = 1111 0000 */ 
printf("c = a << 2 = %d\n", c); 

Первый выход -61, а второй один 240. Почему первый Printf вычисляет дополнение в двоичное 1100 0011, а второй один просто преобразует 1111 0000 в десятичный эквивалент?

+1

@Babbleshack нет, он не мог. Речь идет о предположении, что этот человек сделал о ширине int. – paddy

+0

@paddy хорошая работа, я сделал это комментарий. Мне следовало потратить больше времени на размышления о том, что я сожалею об этом, больной удаляю его. – Babbleshack

+1

'c' будет иметь значение' 1111 1111 1111 1111 1111 1111 1100 0011'. '~' дополняет все биты, а не только те, которые вы перечисляете в первой строке. –

ответ

6

Вы предположили, что размер int составляет всего 8 бит. Вероятно, это не относится к вашей системе, которая, вероятно, будет использовать 16 или 32 бита для int.

В первом примере все биты инвертированы. Это на самом деле прямой инверсии, а не двоичное дополнение:

1111 1111 1111 1111 1111 1111 1100 0011 (32-bit) 
        1111 1111 1100 0011 (16-bit) 

Во втором примере, когда вы переносите его влево на 2, старший бит по-прежнему равен нулю. Вы ввели в заблуждение себя, указав цифры в 8 бит в своих комментариях.

0000 0000 0000 0000 0000 0000 1111 0000 (32-bit) 
        0000 0000 1111 0000 (16-bit) 
+3

Не только в старых системах. В большинстве 8- и 16-битных систем в настоящее время он все еще 16 бит, e. г. на многих мкК. – glglgl

+0

Справедливая точка = = Я сделаю это яснее. – paddy

0

Старайтесь избегать выполнения поразрядных операций со знаками целых чисел - часто это приведет вас к неопределенному поведению.

Ситуация здесь заключается в том, что вы берете значения без знака и присваиваете их подписанной переменной. Для ~60 это undefined behavior. Вы видите его как -61, потому что битовая диаграмма ~60 также является представлением двух-дополнений -61. С другой стороны, 60 << 2 получается правильно, потому что 240 имеет такое же представление, как и целое число под знаком и без знака.

+0

ITYM * ones * дополнение? –

+0

@PaulR no, ~ 60 - это представление двойного дополнения -61 - это дополнение к представлению -60 – Blorgbeard

+0

@PaulR No ... two. Подумайте об этом, '~ 1'' '11111110' (знак расширен для размера слова); то есть -2. '~ 60' составляет -61. Пересмотреть ваш downvote? (Также, прошу прокомментировать?) – TypeIA

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