Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/86: Рейтинг темы: голосов - 86, средняя оценка - 4.69
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?

06.08.2010, 20:13. Показов 17276. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2010, 20:13
Ответы с готовыми решениями:

Какой тип данных использует VBA, если тип явно не объявлен
Какой тип данных использует VBA, если тип явно не объявлен

Как понять, какое значение будет возвращено на выходе, как явно задать тип возвращаемого значения
Здравствуйте. Недавно начал изучать язык VBA. Не могу уяснить логику работы с функциями. До этого изучал MQL. Там структура функции...

Как избавиться от необходимости явно указывать тип в enum?
Как сделать, чтобы для перечислений не нужно было явно указывать тип int? switch (direction) { case...

25
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
06.08.2010, 20:47
Цитата Сообщение от #pragma Посмотреть сообщение
Что будет при битовой операции,если значение результата выходит за пределы типа
это как это?

Добавлено через 5 минут
Цитата Сообщение от #pragma Посмотреть сообщение
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
приведи пример, пожалуйста. что-то я не очень понимаю, как ты хочешь передавать параметры.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 21:04  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
это как это?
Ну вот скажем есть число 0x100000000 в hex которое равно 4,294,967,295 (максимальное unsigned int)
Второе число,скажем 0x0000FFFFF
Их побитовое "или" даёт результат 0x1000FFFFF что равняется 4,296,015,871 и уже выходит за границы диапазона типа unsigned int. В принципе побитовое "и" так же хорошо будет работать и с этим числом,но какого оно типа? Есть ли тут "подводные камни"?
Понятно,что подобные вопросы из-за пробелов в знаниях темы, так что не ругать
Цитата Сообщение от fasked Посмотреть сообщение
приведи пример, пожалуйста. что-то я не очень понимаю, как ты хочешь передавать параметры.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
enum ARGS {
   ARG1 = 0x000000001,
   ARG2 = 0x0000000F0
}
...
bool MyFunction (int param1, uint32_t result_arg) {
   if (result_arg & ARG1)
   {
      ...
   }
}
...
MyFunction(parameter1, ARG1 | ARG2 ) ;
...
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
06.08.2010, 21:30
Цитата Сообщение от #pragma Посмотреть сообщение
Ну вот скажем есть число 0x100000000
ты немного ошибаешься. максимальное значение для unsigned int - 0xFFFFFFFF. то есть то число, которые ты написал, но меньше на единицу.
а битовые операции, они на то и битовые, что действие происходит между двумя битами. один бит одного числа и один бит другого. соответственно никакой речи о выходах за пределы здесь не может быть.

По поводу перечислений точно не знаю. Но sizeof возвращает 4 байта. Так что скорее всего это unsigned int.
2
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 21:38  [ТС]
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.08.2010, 22:12
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
C
1
enum { GOOD = 0, BADLY = 1, VERY_BADLY = 2, VERY_VERY_BADLY = 4, WORSE_THAN_EVER = 8, LITTLE_BIT_MORE_BADLY = 16 };
иначе отдельное значение просто не вытащить...
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 22:39  [ТС]
Ещё тут одна мелочь возникла по ходу написания: какое поведение будет у программы,если задать значения посылаемых аргументов по умолчанию равным NULL? Я понимаю,что будет некий крах,но что именно? И ещё: почему 0 & 1 является нелегальной операцией?
Пример:
C++
1
2
3
4
5
6
bool MyFunction(string param1, uint32_t args = NULL) {
   if ( args & ARG1 ) // ARG1 == 0x00000001
   {
      ...
   }
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2010, 22:40
Цитата Сообщение от #pragma Посмотреть сообщение
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
Нельзя. По стандарту тип enum - целый, а какой конкретно - зависит от реализации. В набор допустимых значений входят все элементы перечисления, а также те значения, которые можно записать при помощи того же количества битов.
1
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.08.2010, 22:44
Цитата Сообщение от fasked Посмотреть сообщение
Так что скорее всего это unsigned int.
C++
1
2
    enum {a = -1};
    cout << a;
Вроде как получается что signed.

Добавлено через 46 секунд
Цитата Сообщение от Mr.X Посмотреть сообщение
а какой конкретно - зависит от реализации.
Вон как. Ну по крайней мере в MSVS signed.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
06.08.2010, 22:47
Цитата Сообщение от Хохол Посмотреть сообщение
Вон как. Ну по крайней мере в MSVS signed.
это еще ничего не значит
C++
1
2
3
4
int main()
{
   unsigned int a = -1;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.08.2010, 22:49
Цитата Сообщение от #pragma Посмотреть сообщение
почему 0 & 1 является нелегальной операцией?
это с какого перепуга?
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main(){
    std::cout << "0 & 1 = " << ( 0 & 1 ) <<std::endl;
    std::cout << "1 & 1 = " << ( 1 & 1 ) << std::endl;
    return 0;
}
1
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.08.2010, 22:50
fasked, однако ж я cout не для красоты написал.
1
06.08.2010, 22:50

Не по теме:

Цитата Сообщение от Хохол Посмотреть сообщение
Однако ж я cout не для красоты написал.
извини, я не заметил :)

0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 23:26  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
это с какого перепуга?
Да,точно,всё работает,просто почему-то убунтовый калькулятор считает эту операцию нелегальной ,это странно

Добавлено через 33 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
C
1
enum { GOOD = 0, BADLY = 1, VERY_BADLY = 2, VERY_VERY_BADLY = 4, WORSE_THAN_EVER = 8, LITTLE_BIT_MORE_BADLY = 16 };
иначе отдельное значение просто не вытащить...
А можно объяснение,почему? У меня вроде работает.
То есть такая комбинация
C++
1
2
3
4
           ARG1 = 0x00001,
           ARG2 = 0x00020,
           ARG3 = 0x00300,
           ARG4 = 0x04000,
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.08.2010, 23:37
Цитата Сообщение от #pragma Посмотреть сообщение
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Задать явно точно нельзя. Как определяется sizeof enum'а - надо курить стандарт. Но вроде бы гарантируется, что влезает как минимум в размер int'а

Что касается битовых масок, то концептуально их делать через enum неправильно, потому как через их побитовую комбинацию получается значение, которое в enum'е отсутствует. Если посмотришь чужой софт на Си, то везде используют int'ы (в смысле базовые типы) и define'ы со значениями. На Си++ видел какие-то ацкие мегаконцепты, что создаются классы, а маска формируется через операцию "<<"

Цитата Сообщение от #pragma Посмотреть сообщение
если задать значения посылаемых аргументов по умолчанию равным NULL?
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.08.2010, 23:49  [ТС]
Почему я enum выбрал. у меня функция выглядит так (ещё не доделал)
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        /// ---------------------------------------------------------------- ///
        enum IS_CONFLICTING_DECLARATION_ARGS {//This is only a try,
                                              //possibly to be removed
           SEARCH_IN_SHARED_VARS      = 0x000001,
           SEARCH_IN_SHARED_ARRS      = 0x000020,
           SEARCH_IN_SHARED_LBLS      = 0x000300,
           SEARCH_IN_GLOBAL_FNCS      = 0x004000,
           SEARCH_IN_ALL_DATA         = 0x050000,
           SEARCH_SHARED_DATA_ONLY    = 0x600000
        };
 
        bool isConflictingDeclaration (string declared_name, _uint32_t args = 0)
        {
           if (
                (findVarName (declared_name, current_funcs) >= 0) ||
                (findVarName (declared_name, current_vars ) >= 0) ||
                (findVarName (declared_name, current_arrs ) >= 0) ||
                (findVarName (declared_name, current_lbls ) >= 0)
              )
              return true;
 
           // Only checking current (local) variables
           if ( args == 0 )
              // Conflicting = no
              return false;
 
           if (
                 ( (args & SEARCH_IN_GLOBAL_FNCS) &&
                   (findVarName (declared_name,functions_stack->front()) >= 0) )
 
                                            ||
 
                 (  (args & SEARCH_IN_SHARED_VARS) &&
                    has_shared_vars                &&
                    (findVarName (declared_name,shared_vars) >= 0)  )
 
                                            ||
 
                 (  (args & SEARCH_IN_SHARED_ARRS) &&
                    has_shared_arrs                &&
                    (findVarName (declared_name,shared_arrs) >= 0)  )
              )
              return true;
 
           // Conflicting = no
           return false;
        }
        /// ---------------------------------------------------------------- ///

И весь этот код сидит внутри класса,включая enum.
А вызов функции выглядит так:
C++
1
2
if ( pool.isConflictingDeclaration (name,pool.SEARCH_IN_ALL_DATA) )
...
С define-ми так не получится
Вся идея этого enum-а - использовать как дополнение к конкретной функции,то есть более ни в каких операциях он не должен учавствовать. Ну не знаю,может,это и плохо,в любом случае можно сделать некое поле констант или ещё что. Вопрос был чисто теоретический
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.08.2010, 23:57
А с Define'ами-то что не получается? Должно быть всё то же самое

Добавлено через 2 минуты
Чем enum принципиально лучше - его можно спрятать в класс, чего с define'ами не сделать. Я бы рядом с enum IS_CONFLICTING_DECLARATION_ARGS завёл "typedef unsigned trampampam" и для параметра args использовал бы этот тип. Когда описания типов лежат рядом - так хотябы будет проще код читать. В enum'е бы ещё завёл поле что-то типа "SEARCH_NULL = 0x00000000" и в качестве дефолтного значения args вписывал бы этот элемент
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
07.08.2010, 00:04
Цитата Сообщение от Evg Посмотреть сообщение
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.08.2010, 00:07
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
[C/C++]Компилятор g++.Странности с true и false.Кто нибудь может прокомментировать/повторить это у себя?
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.08.2010, 00:09  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
Это вроде может зависеть от реализации,то есть может быть
C++
1
#define NULL (void *)0
и на разных платформах могут быть свои значения NULL,как я помню из объяснений Evg.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2010, 00:09
Помогаю со студенческими работами здесь

Какой тип (типы) следует указать при написании переменной,которая будет принимать заданные значения?
Какой тип (типы) следует указать при написании переменной,которая будет принимать заданные значения? `+`, -15

Какой тип данных надо задать для ввода произвольной функции F (x) с клавиатуры
Доброго времени суток! Немогу понять какой тип данных надо задать для ввода произвольной функции F(x) с клавиатуры, используется судя по...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си?
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

Добавить свой тип (Enum) в тип переменной My.Settings
Доброй ночи! В принципе название темы говорит само за себя. Нужен параметр приложения с моим типом данных. В данном случае это enum. Но...

Не могу явно преобразовать тип данных. Hibernate
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста с данным вопросом http://***.ru/topics/37456?page=1#190148. Спасибо.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru