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

Unsigned integer 24 bit - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
12.08.2011, 04:24     Unsigned integer 24 bit #1
Как можно объявить беззнаковый 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++ Разница int, short, unsigned int, unsigned short
Unary minus operator applied to unsigned type, result still unsigned C++
C++ unsigned на плюсах
Загрузка 32 bit DLL в 64 bit DLL C++
Unsigned long в с++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
12.08.2011, 04:29     Unsigned integer 24 bit #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  [ТС]     Unsigned integer 24 bit #3
А какова будет потеря производительности? В википедии написано:
Обращение к битовым полям требует дополнительных команд процессора для маскирования и сдвига, и потому медленнее обращений к словам/байтам. Поэтому битовые поля применяются для максимально полной упаковки информации в местах, где неважна скорость доступа к информации.
Но вроде как 24 бита - это ровно 3 байта, т.е. сдвигать вроде как ничего и не надо?
Сыроежка
Заблокирован
12.08.2011, 19:50     Unsigned integer 24 bit #4
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности? В википедии написано:

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

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

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2011, 11:20     Unsigned integer 24 bit
Еще ссылки по теме:

C++ Comparison between signed and unsigned integer expressions
C++ Приведение типов unsigned char[2] to unsigned char [64]
C++ Не понятный undefined reference to `unsigned long long f<unsigned long long, void>

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
13.08.2011, 11:20     Unsigned integer 24 bit #9
Цитата Сообщение от Damaks Посмотреть сообщение
А какова будет потеря производительности?
Расскажите про new и delete в C++
Хотя для поля размером 24 бит запись будет немного более оптимальной - теоретически это можно сделать за три операции (два store'а и один сдвиг), а чтение - за 4 операции (два load'а, свдиг и or). При этом запись такого поля будет без чтения подолжки (потому что поле находится ровно по границам байтов), что само по себе уже быстрее, чем для произвольного поля. Но это зависит от того, насколько качественно компилятор работает с битовыми полями
Yandex
Объявления
13.08.2011, 11:20     Unsigned integer 24 bit
Ответ Создать тему
Опции темы

Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru