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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.83
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

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

Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)?
Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2010, 20:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? (C++):

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

Какой тип данных правильный при определении времени выполнения? - C++
Народ, какой тип данных привильный. При прирывании счетчик повышает значение на 1(левая колонка), в правой микросекунды. Отрывок кода ...

Как проверить какой тип данных вводится? - C++
Доброго времени суток. Подскажите пожалуйста!С клавиатуры вводится два целых числа.Как после ввода проверить,что было введено именно...

Как осуществить ввод числа, не зная какой тип числа будет введён? - C++
И не объявляя вводимую переменную как double...

Какой символьный тип использует тип std::string? - C++
Какой тип данных использует класс String? Char? И написано ли это в в документе #include <string>?

Как сделать тип enum в структуре беззнаковым - C++
Почему элемент Type структуры BracketBlock signed и как его сделать unsigned, не увеличивая количество бит Type? enum BracketType { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2010, 20:47 #2
Цитата Сообщение от #pragma Посмотреть сообщение
Что будет при битовой операции,если значение результата выходит за пределы типа
это как это?

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

По поводу перечислений точно не знаю. Но sizeof возвращает 4 байта. Так что скорее всего это unsigned int.
2
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 21:38  [ТС] #5
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
06.08.2010, 22:12 #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 };
иначе отдельное значение просто не вытащить...
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.08.2010, 22:39  [ТС] #7
Ещё тут одна мелочь возникла по ходу написания: какое поведение будет у программы,если задать значения посылаемых аргументов по умолчанию равным 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
06.08.2010, 22:40 #8
Цитата Сообщение от #pragma Посмотреть сообщение
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
Нельзя. По стандарту тип enum - целый, а какой конкретно - зависит от реализации. В набор допустимых значений входят все элементы перечисления, а также те значения, которые можно записать при помощи того же количества битов.
1
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
06.08.2010, 22:44 #9
Цитата Сообщение от fasked Посмотреть сообщение
Так что скорее всего это unsigned int.
C++
1
2
    enum {a = -1};
    cout << a;
Вроде как получается что signed.

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

Не по теме:

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

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

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

Цитата Сообщение от #pragma Посмотреть сообщение
если задать значения посылаемых аргументов по умолчанию равным NULL?
Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2010, 23:37
Привет! Вот еще темы с ответами:

Как результат функции конвертировать в тип Enum? - C++
Кто может подсказать как мне результат функции конвертировать в тип Enum, тоесть чтобы результат функции сравнивало со значениями в этом...

Какой будет тип у переменной auto, которой присвоили лямда-функцию - C++
Добрый день. Скажите пожалуйста, какой тип будет у переменной auto, которой присвоили лямбда функцию. Например: ... auto x =...

Зачем нужно явно указывать тип переменной? - C++
Всем привет! Объясните зачем нужно явно указывать тип переменной? Например в С++ это обязательно, а php нет. Просто говорят что не...

Путаница с типами данных TCHAR и char. Какой тип данных выбрать? - C++
Я создавал тему в соседнем разделе:http://www.cyberforum.ru/cpp-networks/thread1119035.html Насколько я понял, то POST-данные в TCHAR...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.08.2010, 23:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru