Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
1 | |
Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении?06.08.2010, 20:13. Показов 16130. Ответов 25
Метки нет (Все метки)
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не стандартные define-ы,а перечисление enum.
Можно ли задать тип значений для членов enum явно(мне в конкретном случае нужен unsigned int)? Что будет при битовой операции,если значение результата выходит за пределы типа (даже не уверен,возможно ли,но вроде бы да)?
0
|
06.08.2010, 20:13 | |
Ответы с готовыми решениями:
25
Какой тип данных использует VBA, если тип явно не объявлен Как понять, какое значение будет возвращено на выходе, как явно задать тип возвращаемого значения Как избавиться от необходимости явно указывать тип в enum? Какой тип (типы) следует указать при написании переменной,которая будет принимать заданные значения? |
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
06.08.2010, 21:04 [ТС] | 3 | |||||
Ну вот скажем есть число 0x100000000 в hex которое равно 4,294,967,295 (максимальное unsigned int)
Второе число,скажем 0x0000FFFFF Их побитовое "или" даёт результат 0x1000FFFFF что равняется 4,296,015,871 и уже выходит за границы диапазона типа unsigned int. В принципе побитовое "и" так же хорошо будет работать и с этим числом,но какого оно типа? Есть ли тут "подводные камни"? Понятно,что подобные вопросы из-за пробелов в знаниях темы, так что не ругать
0
|
06.08.2010, 21:30 | 4 |
ты немного ошибаешься. максимальное значение для unsigned int - 0xFFFFFFFF. то есть то число, которые ты написал, но меньше на единицу.
а битовые операции, они на то и битовые, что действие происходит между двумя битами. один бит одного числа и один бит другого. соответственно никакой речи о выходах за пределы здесь не может быть. По поводу перечислений точно не знаю. Но sizeof возвращает 4 байта. Так что скорее всего это unsigned int.
2
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
06.08.2010, 21:38 [ТС] | 5 |
Спасибо,по поводу операций разъяснил
Про то,как задавать тип явно и возможно ли это,вопрос открыт.
0
|
Модератор
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,870
|
||||||
06.08.2010, 22:12 | 6 | |||||
#pragma, именованные константы, которые должны складываться логическим ИЛИ определяются степенями двойки
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
06.08.2010, 22:39 [ТС] | 7 | |||||
Ещё тут одна мелочь возникла по ходу написания: какое поведение будет у программы,если задать значения посылаемых аргументов по умолчанию равным NULL? Я понимаю,что будет некий крах,но что именно? И ещё: почему 0 & 1 является нелегальной операцией?
Пример:
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
06.08.2010, 22:40 | 8 |
Нельзя. По стандарту тип enum - целый, а какой конкретно - зависит от реализации. В набор допустимых значений входят все элементы перечисления, а также те значения, которые можно записать при помощи того же количества битов.
1
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
||||||
06.08.2010, 22:44 | 9 | |||||
Добавлено через 46 секунд Вон как. Ну по крайней мере в MSVS signed.
0
|
Модератор
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,870
|
||||||
06.08.2010, 22:49 | 11 | |||||
это с какого перепуга?
1
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
06.08.2010, 22:50 | 12 |
fasked, однако ж я cout не для красоты написал.
1
|
fasked
|
06.08.2010, 22:50
#13
|
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
06.08.2010, 23:26 [ТС] | 14 | |||||
Да,точно,всё работает,просто почему-то убунтовый калькулятор считает эту операцию нелегальной ,это странно
Добавлено через 33 минуты А можно объяснение,почему? У меня вроде работает. То есть такая комбинация
0
|
06.08.2010, 23:37 | 15 |
Задать явно точно нельзя. Как определяется sizeof enum'а - надо курить стандарт. Но вроде бы гарантируется, что влезает как минимум в размер int'а
Что касается битовых масок, то концептуально их делать через enum неправильно, потому как через их побитовую комбинацию получается значение, которое в enum'е отсутствует. Если посмотришь чужой софт на Си, то везде используют int'ы (в смысле базовые типы) и define'ы со значениями. На Си++ видел какие-то ацкие мегаконцепты, что создаются классы, а маска формируется через операцию "<<" Я ведь про NULL объяснял. Это некое значение, которое не может принимать ни один из указателей на языковую переменную или результат выделения динамической памяти. Присваивать в целочисленное поле значение указателя (а NULL - это указатель) - это не есть правильно. Нужно инициализировать значением 0
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||
06.08.2010, 23:49 [ТС] | 16 | ||||||||||
Почему я enum выбрал. у меня функция выглядит так (ещё не доделал)
код
И весь этот код сидит внутри класса,включая enum. А вызов функции выглядит так:
Вся идея этого enum-а - использовать как дополнение к конкретной функции,то есть более ни в каких операциях он не должен учавствовать. Ну не знаю,может,это и плохо,в любом случае можно сделать некое поле констант или ещё что. Вопрос был чисто теоретический
0
|
06.08.2010, 23:57 | 17 |
А с Define'ами-то что не получается? Должно быть всё то же самое
Добавлено через 2 минуты Чем enum принципиально лучше - его можно спрятать в класс, чего с define'ами не сделать. Я бы рядом с enum IS_CONFLICTING_DECLARATION_ARGS завёл "typedef unsigned trampampam" и для параметра args использовал бы этот тип. Когда описания типов лежат рядом - так хотябы будет проще код читать. В enum'е бы ещё завёл поле что-то типа "SEARCH_NULL = 0x00000000" и в качестве дефолтного значения args вписывал бы этот элемент
1
|
07.08.2010, 00:04 | 18 |
разве NULL это не 0, то есть
#define NULL 0 во всяком случае в Си++. понятное дело, что концептуально не правильно не указатели приравнивать к NULL, но с технической точки зрения какая разница, если это именованная константа.
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
07.08.2010, 00:09 [ТС] | 20 | |||||
Это вроде может зависеть от реализации,то есть может быть
0
|
07.08.2010, 00:09 | |
07.08.2010, 00:09 | |
Помогаю со студенческими работами здесь
20
Какой тип данных надо задать для ввода произвольной функции F (x) с клавиатуры Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? Добавить свой тип (Enum) в тип переменной My.Settings Не могу явно преобразовать тип данных. Hibernate Тип данных ENUM Тип данных enum Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |