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

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

06.08.2010, 20:13. Показов 17125. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru