Это вопрос в два раза.Преобразование некоторого типа данных в больший тип данных совпадает с арифметическим сдвигом вправо?
Я читал о тонкостях того, как компиляторы обрабатывают код, и у меня такое замешательство. Оба процесса, похоже, следуют той же логике расширения знака для целых чисел со знаком. Так что преобразование просто реализуется как арифметическая правая смена?
Одним из примеров говорится функцию как
Int Fun1(unsigned word) { Return (int) ((word << 24) >> 24); }
Аргумент, передаваемый является 0x87654321. Поскольку это было бы подписано при преобразовании в двоичный файл, как произойдет смена? Моя логика заключалась в том, что левая смена должна извлекать последние 8 бит, оставляя 0 в качестве MSB, и тогда мы продолжим с правом сдвига. Правильно ли эта логика?
Редактировать: Я понимаю, что downvote, вероятно, связано с неуточненной информацией. Предположим, что 32-битная машина большого конца с двумя дополнениями для целых чисел со знаком.
Вы спрашиваете о двухместном дополнении? – tijko
'word' объявляется' unsigned', поэтому он должен скомпилироваться в логическом, а не в арифметическом сдвиге. После сдвига выполняется преобразование в целое число со знаком. – Neapolitan
Если 'int' является 32-битным, то' 0x87654321' имеет тип 'unsigned int' –