2016-12-03 17 views
-3

Это вопрос в два раза.Преобразование некоторого типа данных в больший тип данных совпадает с арифметическим сдвигом вправо?

  1. Я читал о тонкостях того, как компиляторы обрабатывают код, и у меня такое замешательство. Оба процесса, похоже, следуют той же логике расширения знака для целых чисел со знаком. Так что преобразование просто реализуется как арифметическая правая смена?

  2. Одним из примеров говорится функцию как

    Int Fun1(unsigned word) { 
         Return (int) ((word << 24) >> 24); 
    } 
    

    Аргумент, передаваемый является 0x87654321. Поскольку это было бы подписано при преобразовании в двоичный файл, как произойдет смена? Моя логика заключалась в том, что левая смена должна извлекать последние 8 бит, оставляя 0 в качестве MSB, и тогда мы продолжим с правом сдвига. Правильно ли эта логика?

Редактировать: Я понимаю, что downvote, вероятно, связано с неуточненной информацией. Предположим, что 32-битная машина большого конца с двумя дополнениями для целых чисел со знаком.

+0

Вы спрашиваете о двухместном дополнении? – tijko

+0

'word' объявляется' unsigned', поэтому он должен скомпилироваться в логическом, а не в арифметическом сдвиге. После сдвига выполняется преобразование в целое число со знаком. – Neapolitan

+0

Если 'int' является 32-битным, то' 0x87654321' имеет тип 'unsigned int' –

ответ

1

Данные OP «Предположим, что 32-разрядная машина с двумя дополнениями для целых чисел». (Это означает, 32-битный unsigned)

0x87654321 Так как это будет подписан при преобразовании в двоичную

No. 0x87654321 является шестнадцатеричной константой. Он имеет тип unsigned. Он не подписан.


// Int Fun1(unsigned word) { 
int Fun1(unsigned word) { 
     Return (int) ((word << 24) >> 24); 
} 

Fun1(0x87654321) приводит к unsigned word, имеющие значение 0x87654321. Преобразование типа и значения не произошло.

word << 24 имеет значение 0x21000000 и по-прежнему относится к типу unsigned.

(word << 24) >> 24 имеет значение 0x21 и по-прежнему относится к типу unsigned.

Отливка до int сохраняет то же значение 0x21, но теперь тип int.


Так как преобразование просто реализуется как арифметический сдвиг вправо?

Сомнительный, поскольку никакие подписанные изменения не кодируются. C не указывает, как компилятор реализует код C. Возможно, произошла пара смен, маска или размножение/разделение.