crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Непонятная строка
Trisch
  опции профиля:
сообщение 12.1.2014, 0:40
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Вот я в одной библиотеке нашел вот примерно такой код:

template<typename Type>
    static void Read(const char* buffer, Type& retVal, size_t pos=0, int bytes=0)
    {
        retVal = Type(0);
        if (bytes == 0)
            bytes = sizeof(Type);

        for (int i=0; i<bytes; ++i) {
            retVal |= ((Type)(unsigned char)buffer[pos+i]) << 8*i;
        }
    }


вот меня интересует вот эта строчка:
retVal |= ((Type)(unsigned char)buffer[pos+i]) << 8*i;


вот что она делает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.1.2014, 16:20
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


просто переставляет байты в массиве справа налево и помещает их в некую переменную типа Type.

Сообщение отредактировал Iron Bug - 12.1.2014, 16:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 13.1.2014, 13:21
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 12.1.2014, 17:20) *
просто переставляет байты в массиве справа налево и помещает их в некую переменную типа Type.


А есть какие нибудь статьи на эту тему? А то я с таким оператором "|=" не разу не сталкивался(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.1.2014, 20:14
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 13.1.2014, 15:21) *
таким оператором "|=" не разу не сталкивался

Запись
A |= B
эквивалентна
A = A | B

Это оператор логического побитового ИЛИ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 14.1.2014, 14:09
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Я бы тут позаднудствовал: коли уж это библиотека, то вместо 8*i правильнее писать CHAR_BIT*i. А то ведь бывают архитектуры, в которых размер байта (неожиданно!) вовсе не 8 бит, а, например, 32....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 15.1.2014, 0:32
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


размер char тут вовсе ни при чём. идёт перестановка байтов.
я подозреваю, что в реальной жизни с такими машинами юзер не столкнётся. это DSP и там, строго говоря, вообще нет байтов, как таковых. там сигналы, а типы данных просто притянуты за уши, чтобы сделать подобие ОС и языков программирования высокого уровня. там всё либо по 16, либо по 32 бита и других "типов данных" нет. типы данных там просто фикция, чтобы соответствовать стандартам С. и юзерам общераспространённых библиотек это точно не грозит: это слишком специфическое железо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 15.1.2014, 9:51
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Iron Bug, размер char тут как раз при чем. Размер char по Стандарту строго равен 1 байту (5.3.3). А вот то, что размер байта может неожиданно оказаться вовсе не 8 бит, это медицинский факт. Увы, мне приходилось сталкиваться с весьма экзотическими архитектурами.... (например, размер байта 18 бит). Ы ?

К какому результату приведет попытка так "переставить байты" на необычной архитектуре?

PS: на x86 этот код будет работать на ура, вне сомнений.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.1.2014, 18:02
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вообще в хорошей традиции байт = это слово шириной 8 бит (не путать с виндузятно-интеловской терминологией о словах и двойных словах)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 16.1.2014, 8:55
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Охо-хо... Скока заблуждений....

Вообще в хорошей традиции байт - это MADU (Minimum Addressable Data Unit). By definition, таэкскэть: http://www.oxforddictionaries.com/definition/english/byte
А восьмибитные байты называются октетами.

Но это я так, позанудствовал..... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 16.1.2014, 12:13
Сообщение #10


Профессионал
*****

Группа: Модератор
Сообщений: 1594
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


это не заблуждения. это опыт.
всё, где 16, 32 бита - это эмуляторы процессоров на DSP и FPGA.
и для юзера софтовых библиотек ну никак не светит работа с такими системами, потому что там жёсткая специфика и все библиотеки - от прозводителя эмулятора процессора. ну и компиляторы специфические, не поддерживающие многие вещи.
так что занудствовать могу я, с опытом программирования под железо. но про готовые библиотеки там надо забыть и не вспоминать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.1.2020, 23:48