2010-09-27 3 views
0

Ожидается ли, что на всех платформах, размерах int и т. Д. Будет работать как ожидается? Или есть более приемлемый способ сделать это? (Я сделал следующее.)C++ maximum non negative int

#define MAX_NON_NEGATIVE_INT ((int)(((unsigned int)-1)/2)) 

Я не буду оскорблять ваш интеллект, объясняя, что он делает!

Редактировать: Я должен был упомянуть, что я не могу использовать какие-либо стандартные классы, потому что я бегу без времени выполнения C.

+3

Что не так с использованием 'INT_MAX' от' '? – schot

+0

Эта уродливая #define может стать хорошим #include, как предложено ниже, и решить вашу проблему. – Raveline

+0

В моей системе INT_MAX определяется как «#define INT_MAX 2147483647». 2147483647 - это то, что я также получаю от своего определения выше. Но что произойдет, если размер int не 32 бита в целевой системе? – Sam

ответ

7

Если вы не хотите использовать определяет (и вы хотите стандартный способ вычисления пределов), то сделать это:

#include <limits> 
std::numeric_limits<int>::min() 

Это стандарт ANSI определяет в limits.h:

#define INT_MIN  (-2147483647 - 1) /* minimum (signed) int value */ 
#define INT_MAX  2147483647 /* maximum (signed) int value */ 
#define UINT_MAX  0xffffffff /* maximum unsigned int value */ 

это определяет из BaseTsd.h:

#define MAXUINT  ((UINT)~((UINT)0)) 
#define MAXINT  ((INT)(MAXUINT >> 1)) 
#define MININT  ((INT)~MAXINT) 
+0

Я запускаю VS2005, а MAXINT не определен нигде в заголовках! Ближайшим в BaseTsd.h является MAXINT_PTR, но нет банана. Тем не менее, версии _PTR, которые у меня есть, почти совпадают с приведенными выше.Что еще более важно, вышесказанное делает именно то, что делает мой первоначальный определение, за исключением того, что он делает «>> 1», где я делаю «/ 2». Единственное различие заключается в том, что я сработал MAXINT и MAXUINT вместе! – Sam

+0

Это неправильные макросы: http://tigcc.ticalc.org/doc/limits.html Также, поскольку это вопрос на C++, вы должны указывать числовые_пределения –

+1

Спасибо Мартин, я обновил ответ, чтобы отразить это. –

11

Существует a standard way to this:

#include <limits> 
#include <iostream> 

cout << numeric_limits<unsigned int>::max(); 

Будучи стандартом, это гарантированно будет переносим на всех платформах.

+0

Вы должны заметить, что 'numeric_limits' не даст вам постоянного выражения. Поэтому вы не можете писать, например, 'enum X {x1 = std :: numeric_limits :: max()};'. –

0

Вы можете взглянуть на класс numeric_limits, включенный в стандартную библиотеку.

См. here.

0

Я бы изменить то, что вы указали только немного, так как вы кодирования C++, а не С.

const int MAXINT =(int)(((unsigned int)-1) >> 1), MININT = -MAXINT -1; 

Я предпочитаю сдвиг вправо над разделите на 2, хотя они делают то же самое, потому что немного сдвигая более наводит на мысль о бит-манипуляции, используемой для генерации MAXINT.

MAXINT дает то же самое, что вы получите с помощью

#include <limits> 
    const int OFFICIALMAXINT = numeric_limits<int>::max(); 

MININT дает то же самое, что вы получите с помощью

#include <limits> 
    const int OFFICIALMININT = numeric_limits<int>::min(); 

жестко прописывать эти значения, так как некоторые выше предложил , является идеей бааада.

Я предпочитаю бить, потому что я знаю, что это всегда правильно, и мне не нужно полагаться на запоминание библиотеки и синтаксис вызова, но это зависит от предпочтения.