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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.83
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 20:13     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #1
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2010, 20:13     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?
Посмотрите здесь:

C++ Как проверить какой тип данных вводится?
Зачем нужно явно указывать тип переменной? C++
Как результат функции конвертировать в тип Enum? C++
C++ Какой тип данных правильный при определении времени выполнения?
C++ Как осуществить ввод числа, не зная какой тип числа будет введён?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.08.2010, 20:47     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #2
Цитата Сообщение от #pragma Посмотреть сообщение
Что будет при битовой операции,если значение результата выходит за пределы типа
это как это?

Добавлено через 5 минут
Цитата Сообщение от #pragma Посмотреть сообщение
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
приведи пример, пожалуйста. что-то я не очень понимаю, как ты хочешь передавать параметры.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 21:04  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #3
Цитата Сообщение от 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 ) ;
...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.08.2010, 21:30     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #4
Цитата Сообщение от #pragma Посмотреть сообщение
Ну вот скажем есть число 0x100000000
ты немного ошибаешься. максимальное значение для unsigned int - 0xFFFFFFFF. то есть то число, которые ты написал, но меньше на единицу.
а битовые операции, они на то и битовые, что действие происходит между двумя битами. один бит одного числа и один бит другого. соответственно никакой речи о выходах за пределы здесь не может быть.

По поводу перечислений точно не знаю. Но sizeof возвращает 4 байта. Так что скорее всего это unsigned int.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 21:38  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #5
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.08.2010, 22:12     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #6
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
C
1
enum { GOOD = 0, BADLY = 1, VERY_BADLY = 2, VERY_VERY_BADLY = 4, WORSE_THAN_EVER = 8, LITTLE_BIT_MORE_BADLY = 16 };
иначе отдельное значение просто не вытащить...
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 22:39  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #7
Ещё тут одна мелочь возникла по ходу написания: какое поведение будет у программы,если задать значения посылаемых аргументов по умолчанию равным NULL? Я понимаю,что будет некий крах,но что именно? И ещё: почему 0 & 1 является нелегальной операцией?
Пример:
C++
1
2
3
4
5
6
bool MyFunction(string param1, uint32_t args = NULL) {
   if ( args & ARG1 ) // ARG1 == 0x00000001
   {
      ...
   }
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
06.08.2010, 22:40     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #8
Цитата Сообщение от #pragma Посмотреть сообщение
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
Нельзя. По стандарту тип enum - целый, а какой конкретно - зависит от реализации. В набор допустимых значений входят все элементы перечисления, а также те значения, которые можно записать при помощи того же количества битов.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
06.08.2010, 22:44     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #9
Цитата Сообщение от fasked Посмотреть сообщение
Так что скорее всего это unsigned int.
C++
1
2
    enum {a = -1};
    cout << a;
Вроде как получается что signed.

Добавлено через 46 секунд
Цитата Сообщение от Mr.X Посмотреть сообщение
а какой конкретно - зависит от реализации.
Вон как. Ну по крайней мере в MSVS signed.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.08.2010, 22:47     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #10
Цитата Сообщение от Хохол Посмотреть сообщение
Вон как. Ну по крайней мере в MSVS signed.
это еще ничего не значит
C++
1
2
3
4
int main()
{
   unsigned int a = -1;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.08.2010, 22:49     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #11
Цитата Сообщение от #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;
}
Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
06.08.2010, 22:50     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #12
fasked, однако ж я cout не для красоты написал.
fasked
06.08.2010, 22:50
  #13

Не по теме:

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

#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 23:26  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #14
Цитата Сообщение от 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,
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
06.08.2010, 23:37     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #15
Цитата Сообщение от #pragma Посмотреть сообщение
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Задать явно точно нельзя. Как определяется sizeof enum'а - надо курить стандарт. Но вроде бы гарантируется, что влезает как минимум в размер int'а

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

Цитата Сообщение от #pragma Посмотреть сообщение
если задать значения посылаемых аргументов по умолчанию равным NULL?
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 23:49  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #16
Почему я 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-а - использовать как дополнение к конкретной функции,то есть более ни в каких операциях он не должен учавствовать. Ну не знаю,может,это и плохо,в любом случае можно сделать некое поле констант или ещё что. Вопрос был чисто теоретический
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
06.08.2010, 23:57     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #17
А с Define'ами-то что не получается? Должно быть всё то же самое

Добавлено через 2 минуты
Чем enum принципиально лучше - его можно спрятать в класс, чего с define'ами не сделать. Я бы рядом с enum IS_CONFLICTING_DECLARATION_ARGS завёл "typedef unsigned trampampam" и для параметра args использовал бы этот тип. Когда описания типов лежат рядом - так хотябы будет проще код читать. В enum'е бы ещё завёл поле что-то типа "SEARCH_NULL = 0x00000000" и в качестве дефолтного значения args вписывал бы этот элемент
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.08.2010, 00:04     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #18
Цитата Сообщение от Evg Посмотреть сообщение
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.08.2010, 00:07     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #19
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
[C/C++]Компилятор g++.Странности с true и false.Кто нибудь может прокомментировать/повторить это у себя?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2010, 00:09     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?
Еще ссылки по теме:

Какой символьный тип использует тип std::string? C++
Как сделать тип enum в структуре беззнаковым C++
C++ Какой будет тип у переменной auto, которой присвоили лямда-функцию

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

Или воспользуйтесь поиском по форуму:
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.08.2010, 00:09  [ТС]     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? #20
Цитата Сообщение от fasked Посмотреть сообщение
разве NULL это не 0, то есть
#define NULL 0
во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
Это вроде может зависеть от реализации,то есть может быть
C++
1
#define NULL (void *)0
и на разных платформах могут быть свои значения NULL,как я помню из объяснений Evg.
Yandex
Объявления
07.08.2010, 00:09     Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?
Ответ Создать тему
Опции темы

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