Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: битовое поле  (Прочитано 11974 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 04-10-2005 06:21 » 

почему везде упоминается, что в качестве "типа" для битовых полей
должно использоваться int, а вот это компилятор съел:

struct s_byte
{
   BYTE bit1:1;
   BYTE bit2:1;
   BYTE bit3:1;
   BYTE bit4:1;
   BYTE bit5:1;
   BYTE bit6:1;
   BYTE bit7:1;
   BYTE bit8:1;
};

причём sizeof показывает 1 байт , а не 4 (как если бы компилятор сделал его int принудительно)

ещё больше смущает такая штука:

struct s_pole64
{
   unsigned __int64 b1:16;
   unsigned __int64 b2:16;
   unsigned __int64 b3:16;
   unsigned __int64 b4:16;
   //unsigned __int64 b5:1;   // 65-й бит !
};

- тоже прокатывает, причём sizeof показывает 64 бита (8 байт) , а если разремарить
65-й бит - то sizeof показывает 128 битов

вопрос: не нарушаются ли стандарты? Больно уж красиво всё получается Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 04-10-2005 06:47 » 

Лёха, а в чем ты видиш нарушение стандарта.
Цитата
struct s_pole64
{
   unsigned __int64 b1:16;
   unsigned __int64 b2:16;
   unsigned __int64 b3:16;
   unsigned __int64 b4:16;
   //unsigned __int64 b5:1;   // 65-й бит !
};
Тут ты используеш тип __int64 который занимает 64 бита или 8 байт. В первых четыре строках структуры ты уже использовал это пространство 4*16=64. Следовательно компилятор под следуюшее пространство выделит еше 64 бита или 8 байт.
Почему не рекомендуют использовать тип BYTE. Думаю все дело в выравнивании. не все просессоры могут читать невыровненые данные. и вызывают критическую ошибку. Ну еше невыровненные данные процессор читает дольше, чем выровненые. Поэтому компилятор выравнивает данные для 32 разрядных систем на 4 байтовые граници. Тем самым при использовании типа BYTE ты все равно используеш 4 байта памяти.
« Последнее редактирование: 04-10-2005 07:03 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 04-10-2005 07:06 » 

Лёха, а в чем ты видиш нарушение стандарта.

в __int64 - не вижу . Я всё о том же вездесущем упоминании int

если дело именно в выравнивании тогда всё понятно Улыбаюсь Хотя жаль под байт целых четыре выделять

ну да ладно
Записан

Alf
Гость
« Ответ #3 : 04-10-2005 07:12 » 

почему везде упоминается, что в качестве "типа" для битовых полей должно использоваться int

Я не знаю такого первоисточника - "везде". Поэтому вместо него обратился к MSDN. Вот что там написано:

Цитата
Classes and structures can contain members that occupy less storage than an integral type. These members are specified as bit fields. The syntax for bit-field member-declarator specification follows:

declaratoropt  : constant-expression

The declarator is the name by which the member is accessed in the program. It must be an integral type (including enumerated types).

(выделение мое). Integral - это не только int, но и его родственнники.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 04-10-2005 07:14 » 

int по стандарту всегда имеет размер разрядности компа. Если комп 16 разрядный. То int будет иметь 16 бит, для 32 разрядных соответственно 32 бита и 64 - 64 бита. Т.е. его рекомендуют использовать из-за переносимости кода без излишней доработки программы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 04-10-2005 08:42 » new

понятно, пасиба
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines