Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
#1

Unsigned integer 24 bit - C++

12.08.2011, 04:24. Просмотров 1472. Ответов 8
Метки нет (Все метки)

Как можно объявить беззнаковый integer размером в 24 бита?

Если я объявлю его как битовое поле в структуре, например так:

C++
1
2
3
4
5
6
struct rgb
{
    unsigned r:24;
    unsigned g:24;
    unsigned b:24;
};
Над ним можно будет производить арифметические операции как с обычным int'ом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2011, 04:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Unsigned integer 24 bit (C++):

Comparison between signed and unsigned integer expressions - C++
Много вот таких варнингов: Comparison between signed and unsigned integer expressions FreeBSD 10 gcc 4.8 Ввожу:gmake libthecore...

Unary minus operator applied to unsigned type, result still unsigned - C++
Подскажите, имеем следующий код: signed int a = -0x80000000; signed int b = -1; signed int c = (a / b);

Приведение типов unsigned char[2] to unsigned char [64] - C++
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { SHA1Context sha; uint8_t...

Не понятный undefined reference to `unsigned long long f<unsigned long long, void> - C++
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename std::enable_if&lt;std::is_same&lt;FormalType,...

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"? - C++
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из &quot;unsigned int&quot; в &quot;unsigned int &quot;) как ее...

64 bit double to 80 bit - C++
Есть double переменная надо сделать из неё 80 - битную переменную, в интернете нашёл только этот асмовский код но он не работает. void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
12.08.2011, 04:29 #2
Цитата Сообщение от Damaks Посмотреть сообщение
Как объявить беззнаковый integer размером в 24 бита?

Добавлено через 14 минут
Если я объявлю его как битовое поле в структуре, например так:

struct rgb
{
unsigned r:24;
unsigned g:24;
unsigned b:24;
};

с ним можно будет делать арифметические операции как с обычным int'ом?
Вы можете объявлять только те типы данных, которые предоставляет компилятор. Так что если компилятор не предоставляет такого типа, как беззнаковое размером 24 бита, то вы ничего сделать не сможете.

Что касается битовых полей, которые вы объявили в структуре, то с ними можно работать как с целыми числами, потому что в выражениях они преобразуются к целому числу типа unsigned int.
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
12.08.2011, 19:06  [ТС] #3
А какова будет потеря производительности? В википедии написано:
Обращение к битовым полям требует дополнительных команд процессора для маскирования и сдвига, и потому медленнее обращений к словам/байтам. Поэтому битовые поля применяются для максимально полной упаковки информации в местах, где неважна скорость доступа к информации.
Но вроде как 24 бита - это ровно 3 байта, т.е. сдвигать вроде как ничего и не надо?
Сыроежка
Заблокирован
12.08.2011, 19:50 #4
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности? В википедии написано:

Но вроде как 24 бита - это ровно 3 байта, т.е. сдвигать вроде как ничего и не надо?
Дело в том, что следующее битовове поле хранит часть своих битов в оставшемся четвертом байте. То есть битовые поля непрерывны. Если вы хотите разбить их по единицам хранения, то встаьвте между ними битовое поле размером 0, и тогда следующее битовое поле будет помещаться в отдельную единицу хранения, то есть в отдельное unsigned int.
Например,

struct rgb
{
unsigned r:24;
unsigned:0;
unsigned g:24;
unsigned:0;
unsigned b:24;
};

Только я не уверен, что алгоритм выделения битов у компилятора изменится. Надо смотреть результирующий ассемблерский код.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
12.08.2011, 20:02 #5
Это на каждый канал по 24 бита получается? Круто! Бывает, конечно, и такое, но не часто. В 24-битной картинке по 8 бит на канал, то есть в unsigned int ещё и для альфа-канала 8 бит останется...
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
12.08.2011, 20:47 #6
Цитата Сообщение от easybudda Посмотреть сообщение
Это на каждый канал по 24 бита получается? Круто! Бывает, конечно, и такое, но не часто.
А я вот, кстати, тоже хотел спросить, но забыл. Где такое чудо бывает, как эти 24 бита получают и как их потом используют. На канал, разумеется
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
12.08.2011, 22:06 #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
А я вот, кстати, тоже хотел спросить, но забыл
При сканировании слайдов для увеличения глубины цвета на канал, бывает, 16 бит используют (на обычном сканере тыщи за две рублей такое конечно не исполнишь), про то, что может быть и 24, в книжках только читал, сам никогда не встречал. Но потом всё равно к 8 битам на канал сводят, в CMYK как-раз 32 получается...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
13.08.2011, 11:09 #8
> Текущие возможности GEGL:
> 8-/16-/32-разрядные (с плавающей точкой) режимы, внутренняя обработка — в 128-разрядном режиме;

Evg
Эксперт CАвтор FAQ
17625 / 5849 / 376
Регистрация: 30.03.2009
Сообщений: 16,133
Записей в блоге: 26
13.08.2011, 11:20 #9
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности?
Расскажите про new и delete в C++
Хотя для поля размером 24 бит запись будет немного более оптимальной - теоретически это можно сделать за три операции (два store'а и один сдвиг), а чтение - за 4 операции (два load'а, свдиг и or). При этом запись такого поля будет без чтения подолжки (потому что поле находится ровно по границам байтов), что само по себе уже быстрее, чем для произвольного поля. Но это зависит от того, насколько качественно компилятор работает с битовыми полями
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2011, 11:20
Привет! Вот еще темы с ответами:

Разница int, short, unsigned int, unsigned short - C++
Есть например цикл который проходит по массиву в котором 100 элементов. В чем практическая выгода и разница в истоьзовании типов short,...

Загрузка 32 bit DLL в 64 bit DLL - C++
Доброго дня, в своем предыдущем посту я озадачивался вопросом о том, как можно прикрутить DLL файл в проект visual studio, для доступа...

Signed/Unsigned - C++
Здравствуйте! Стал изучать ЯП C. Не совсем могу понять, что означает Signed и Unsigned (как я понял означает наличие знака(+ либо -) или...

unsigned на плюсах - C++
unsigned на плюсах, помогите разобраться, когда её нужно юзать, а когда нет) та и для чего она впринцепе)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.08.2011, 11:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru