| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > short, перестановка байтов |
| Автор: andrew_121 25.8.2008, 18:14 |
| Дарова! Вопрос: Нужно в unsigned short поменять местами первый и второй байт. Поделитесь кодом...плиз... |
| Автор: Lazin 25.8.2008, 18:28 | ||
|
| Автор: Alek86 25.8.2008, 18:33 | ||
| не люблю сдвиги писалось на коленке
если критично по скорости, то скорее всего компилер оптимизнет как надо ЗЫ. кстати, стандарт не говорит, что sizeof(unsigned short) == 2 |
| Автор: andrew_121 25.8.2008, 18:51 |
Гм... А что он говорит? |
| Автор: Alek86 25.8.2008, 19:03 |
| он говорит 1. sizeof(char) == sizeof(unsigned char) == 1; 2. sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long); стандарта, как всегда, под рукой нету Добавлено через 52 секунды кроме того он говорит, что размер wchar_t тоже не обязательно 2 (чем меня окончательно убил |
| Автор: andrew_121 25.8.2008, 19:25 |
| Alek86, Мдя... Вот тебе и стандарт... |
| Автор: cutwater 25.8.2008, 19:30 |
| Что есть нормально. Компиляторо и платформо зависимые размеры типов данных |
| Автор: ama_kid 25.8.2008, 20:14 | ||
ну и на всякий случай мой вариант - без использования других переменных:
|
| Автор: Gwendolen 25.8.2008, 21:55 | ||
Можно определять размер типа...
|
| Автор: Lazin 25.8.2008, 22:14 |
мне кажется здесь может быть UB |
| Автор: andrew_121 25.8.2008, 22:23 |
| Вопрос решен. Всем огромное спасибо! |
| Автор: bsa 25.8.2008, 22:37 | ||
Почему? Не вижу ни единой причины для этого. |
| Автор: mes 25.8.2008, 23:16 | ||
для UB в подобном случае должно быть еше и присваивание, для двух (и более) членов ссылаюшихся на одну и ту же область памяти.. в примере хоть и две var, но они только отдают значение и присваивания для них нет... |
| Автор: W4FhLF 26.8.2008, 06:26 | ||
Ещё такой вариант:
Добавлено @ 06:28 Вот, кстати, реализация машинной команды ROR на С. |
| Автор: ksili 26.8.2008, 11:28 |
| W4FhLF, забыл ещё назад из AX в var выгрузить |
| Автор: W4FhLF 26.8.2008, 11:32 |
| ksili, не забыл. Зачем? Возвращаемое значение в ax. Параметр не по ссылке передан. |
| Автор: JackYF 26.8.2008, 12:15 | ||
x86-only, intel assembler only... |
| Автор: W4FhLF 26.8.2008, 16:01 |
| JackYF, и что? Я где-то утверждал обратное или навязывал этот способ? Автор топика где-то говорил под какую платформу пишет? Просто тут все(почти) привели платформозависимый код, но почему-то ты выделил именно мой |
| Автор: JackYF 26.8.2008, 16:03 |
Это не наезд, это предупреждение тем, кому может понравится данный способ. Мы в общих вопросах, поэтому узкоспециализированные решения хорошо бы помечать сразу в постах как таковые. |
| Автор: W4FhLF 26.8.2008, 16:26 |
| JackYF, согласен. Я, в общем-то, подозревал, что кто-то об этом упомянет. |
| Автор: MAKCim 26.8.2008, 22:45 |
ну еще x86_64 |
| Автор: W4FhLF 27.8.2008, 05:08 |
Он, конечно, выполнится, только unsogned short там 4 байта |
| Автор: bsa 27.8.2008, 10:50 | ||||||
|
| Автор: MAKCim 27.8.2008, 10:50 |
нет хотя это на усмотрение компилятора в GCC sizeof(short) = 2 sizeof(int) = 4 sizeof(long) = 8 насколько я знаю в VS sizeof(int) = sizeof(long) = 4 |
| Автор: W4FhLF 27.8.2008, 11:05 |
| Ребята, вы правы, перепутал мну. |
| Автор: andrew_121 27.8.2008, 12:44 |
| Вопрос: Чему должно равнятся 4096 после такой перестановки? |
| Автор: MAKCim 27.8.2008, 12:48 |
00010000 00000000 -> 00000000 00010000 = 16 |
| Автор: andrew_121 27.8.2008, 12:49 |
| MAKCim, Спасибо! Я так и думал, просто решил перепроверится! Тебе плюсик! |
| Автор: Ln78 27.8.2008, 15:57 |
| Ну вот, а я было подумал, что это новый тип такой, несогнутый (unsogned ), а потому и длинный |