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;


вот что она делает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 15.1.2014, 9:51
Сообщение #2


Участник
**

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

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




Репутация:   8  


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

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

PS: на x86 этот код будет работать на ура, вне сомнений.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.6.2025, 11:35