IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Максимально возможное значение типа, С++
sheka
сообщение 1.12.2011 19:48
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Максимально возможное значение типа
unsigned int j = (1 << (sizeof(имя типа) << 3)) - 1; 
как избавиться от вычисления 1 << (sizeof(имя типа) << 3) т.к. warning: left shift count >= width of type ?
Можно, конечно, так, но это не красиво:
unsigned int j = ((unsigned int)(1 << ((sizeof(int *) << 3) - 1)) - 1) + (1 << ((sizeof(int *) << 3) - 1));
Ну или просто обмануть, умножив на 2.

Сообщение отредактировано: sheka - 1.12.2011 19:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 1.12.2011 19:59
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Не пользоваться неправильным методом вычисления. Допустим, размер типа - 4 байта (тот же int). Что выдает твоя формула?

(1 << (4 << 3)) - 1 = (1 << 32) - 1 = 4294967295 (для этого тоже нужны доп. телодвижения, чтобы получить это число, но допустим, получил). Но макс. значение типа int вполовину меньше, он же знаковый...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 1.12.2011 20:01
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Для беззнаковых.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 1.12.2011 20:02
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


    long long maxval = (static_cast<long long>(1) << (sizeof(int) << 3)) - 1;

Но это будет работать только для тех типов, размер которых меньше размера long long иначе опять получишь то же предупреждение.

А вот это:
cout << numeric_limits<long long>::max() << endl; // #include <limits>

будет работать всегда smile.gif

Сообщение отредактировано: IUnknown - 1.12.2011 20:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 1.12.2011 20:07
Сообщение #5


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Т.е. культурного решения, кроме как взять тип большей вместимости, нет?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 1.12.2011 20:08
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


См. выше, и не изобретай велосипед. "Все уже придумано до нас" (С) smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 2.12.2011 9:18
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


unsigned long i = -1
получили максимальное значение, гы


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 27.04.2024 22:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"