Как вы находите диапазон значений, которые целочисленные типы могут представлять в C ++?

Размер и диапазон типов целочисленных значений в C ++ зависят от платформы. Значения, найденные в большинстве 32-битных систем, можно найти в разделе Переменные. Типы данных. - Документация C ++ . Как вы определяете, каков реальный размер и диапазон для вашей конкретной системы?

10.12.2008 21:13:25
9 ОТВЕТОВ
РЕШЕНИЕ

Стиль С

limit.h содержит минимальные и максимальные значения для целых чисел, а также другие типы данных, которые должны быть именно такими, какие вам нужны:

#include <limits.h> // C header
#include <climits> // C++ header

// Constant containing the minimum value of a signed integer (–2,147,483,648)
INT_MIN; 

// Constant containing the maximum value of a signed integer (+2,147,483,647)
INT_MAX;

Полный список констант и их общих значений смотрите в: Wikipedia - limit.h


Стиль С ++

Существует основанный на шаблонах метод C ++, как упоминали другие комментаторы, используя:

  #include <limits>

  std::numeric_limits

который выглядит как:

  std::numeric_limits<int>::max();

и он может даже делать более хитрые вещи, такие как определение количества возможных цифр или подписанный тип данных:

  // Number of digits for decimal (base 10)
  std::numeric_limits<char>::digits10;

  // Number of digits for binary
  std::numeric_limits<char>::digits;

  std::numeric_limits<unsigned int>::is_signed;
38
10.12.2008 22:15:02
+1 за злобно быструю Я получил готовый ответ, но отвлекся на минуту. :)
Bill the Lizard 10.12.2008 21:19:51
Я бы нашел путь использования numeric_limits, чтобы быть предпочтительным.
Jon Trauntvein 10.12.2008 21:21:07
будьте осторожны при использовании :: цифры. Вы получите количество бит (исключая знаковый бит), то есть двойные цифры :). :: digits10 даст вам количество десятичных цифр.
Johannes Schaub - litb 10.12.2008 21:53:10
будьте осторожны в win32, если вы также включите windows.h, max определен как макрос, и вы получите странное поведение при компиляции.
Doug T. 10.12.2008 22:16:21
@Doug T .: Используйте взамен (std :: numeric_limits <int> :: max) () или отмените max до этого вызова.
Jasper Bekkers 10.12.2008 22:26:20

Почему бы просто не быть уверенным и использовать числовые типы boost?

то есть:

boost::uint32_t
boost::int32_t

так далее

6
10.12.2008 21:15:31
Это хорошо, я бы сказал, что единственная реальная проблема - это зависимость от библиотеки наддува.
BobbyShaftoe 10.12.2008 21:37:33

Взгляни на std::numeric_limits

9
10.12.2008 21:17:59
Это интересно. Я не знал об этом раньше.
Bill the Lizard 10.12.2008 21:29:05
оба имеют свое применение. макросы из climits могут использоваться в тестах препроцессора и могут передаваться как аргументы шаблона. в то время как numeric_limits предлагает некоторые другие тонкие возможности, помимо проверки диапазона.
Johannes Schaub - litb 10.12.2008 21:31:36

Используйте sizeof()оператор в C ++, чтобы определить размер (в байтах) типа значения. Заголовочный файл стандартной библиотеки limit.h содержит пределы диапазона для целочисленных типов значений. Вы можете запустить следующую программу, чтобы узнать размер и пределы диапазона для целочисленных типов в вашей системе.

#include <stdlib.h>
#include <iostream>
#include <limits>

using namespace std;

int main(int argc, char** argv) {

    cout << "\nCharacter Types" << endl;
    cout << "Size of character type is " << sizeof(char) << " byte." << endl;
    cout << "Signed char min: " << SCHAR_MIN << endl;
    cout << "Signed char max: " << SCHAR_MAX << endl;
    cout << "Unsigned char min: 0" << endl;
    cout << "Unsigned char max: " << UCHAR_MAX << endl;

    cout << "\nShort Int Types" << endl;
    cout << "Size of short int type is " << sizeof(short) << " bytes." << endl;
    cout << "Signed short min: " << SHRT_MIN << endl;
    cout << "Signed short max: " << SHRT_MAX << endl;
    cout << "Unsigned short min: 0" << endl;
    cout << "Unsigned short max: " << USHRT_MAX << endl;

    cout << "\nInt Types" << endl;
    cout << "Size of int type is " << sizeof(int) << " bytes." << endl;
    cout << "Signed int min: " << INT_MIN << endl;
    cout << "Signed int max: " << INT_MAX << endl;
    cout << "Unsigned int min: 0" << endl;
    cout << "Unsigned int max: " << UINT_MAX << endl;

    cout << "\nLong Int Types" << endl;
    cout << "Size of long int type is " << sizeof(long) << " bytes." << endl;
    cout << "Signed long min: " << LONG_MIN << endl;
    cout << "Signed long max: " << LONG_MAX << endl;
    cout << "Unsigned long min: 0" << endl;
    cout << "Unsigned long max: " << ULONG_MAX << endl;

    return (EXIT_SUCCESS);
}
2
10.12.2008 21:43:59

Вы можете использовать типы, определенные в stdint.h (или cstdint , если вы используете C ++), которые являются частью стандарта C99. Он определяет типы с такими именами, как int32_t , uint8_t , int64_t и т. Д. , Которые гарантированно переносимы и не зависят от платформы.

Для получения дополнительной информации: stdint.h

3
10.12.2008 21:38:09
Спасибо. Приятно знать независимую от платформы альтернативу.
Bill the Lizard 10.12.2008 21:41:23
К сожалению, stdint.h и cstdint не поставляются с Microsoft Visual Studio (2008). Запись WikiPedia (приведенная выше) предлагает несколько альтернатив. Вот постоянная ссылка: en.wikipedia.org/w/index.php?title=Stdint.h&oldid=280101290
nobar 5.04.2009 04:38:59
sizeof(int)
-5
10.12.2008 21:42:26
Это говорит вам, сколько байтов тип занимает в памяти. Что говорит вам диапазон?
Bill the Lizard 10.12.2008 21:44:52
От 0 до 2 ** (sizeof (int) * 8) - 1, в любом случае для неподписанных типов :-)
Ferruccio 10.12.2008 21:58:48
Ферруччо. nono, давайте оставаться переносимыми: от 0 до 2 ** (sizeof (int) * CHAR_BIT) - 1 хе-хе
Johannes Schaub - litb 10.12.2008 21:59:28
Даже тогда, все еще не портативный. Единственными целочисленными типами, в которых каждый бит представления хранилища требуется для участия в представлении значения, являются три типа символов. Вполне допустимо иметь 9-битный символ, но 32-битный int.
Steve Jessop 11.12.2008 22:48:15

Вы можете получить диапазон любого типа данных, применив следующую формулу:

[-2 мощности (N-1)] до {[+2 мощности (N-1)] - 1}

Где «N» - ширина типа данных, например, в JAVA ширина int равна 32, следовательно, N = 32.

Попробуйте это, вы получите это.

0
30.11.2011 16:50:47
#include<stdio.h>  
#include<limits.h>   
void main()  
{  
     printf(" signed data types " );  
     printf(" int min : %d ", INT_MIN); // INT_MIN, INT_MAX, SCHAR_MIN, SCHAR_MAX ....etc  
     printf(" int max : %d  ",INT_MAX);// pre defined constants to get the values of datatypes       
     printf(" signed char min : %d ", SCHAR_MIN);  
     printf(" signed char max : %d ", SCHAR_MAX);  
// similarly for un_signed  
// use %u for control charter, and UINT_MAX, UCHAR_MAX, USHRT_MAX, ULONG_MAX.  
}
1
12.12.2012 05:14:21

Побитовые операции могут использоваться для определения количества бит и диапазона int в платформе. Вот пример, который я написал, чтобы проверить диапазон int на моей машине.

    #include <iostream>

    using namespace std;


    void print_int_range() {
        int i=1;

        int nOfBits=0;
        while (i != 0) {
            i = i << 1;
            nOfBits++;
        }

        cout << "int has " << nOfBits << " bits" << endl;

        cout << "mininum int: " << (1 << (nOfBits - 1)) << ", maximum int: " << ~(1 << (nOfBits - 1))  << endl;

    }

    void print_unsigned_int_range() {
        unsigned int i=1;

        int nOfBits=0;
        while (i != 0) {
            i = i << 1;
            nOfBits++;
        }

        cout << "unsigned int has " << nOfBits << " bits" << endl;

        cout << "mininum int: " << (0) << ", maximum int: " << (unsigned int) (~0) << endl;
    }


    int main() {
        print_int_range();

        print_unsigned_int_range();
    }

И вот мой вывод:

int has 32 bits 
mininum int: -2147483648, maximum int: 2147483647 
unsigned int has 32 bits 
mininum int: 0, maximum int: 4294967295
0
19.11.2013 07:24:14
подписанное нижнее значение является технически неопределенным поведением. Ваш тест - чистое поведение во время выполнения. Вы можете достичь тех же результатов сstd::numeric_limits
stefan 18.11.2013 09:43:44
@ Stefan Полезно знать. Спасибо!
Shaohong Li 18.11.2013 09:52:56
КСТАТИ @stefan, я не использую здесь "underflow". Я использую свое понимание представления целых чисел в двух дополнениях на типичных компьютерных платформах.
Shaohong Li 19.11.2013 06:21:04
Вы предполагаете конкретное представление для минимума: (1 << (nOfBits - 1))это первая не гарантированная вещь. Во-вторых, для максимума вы вычитаете 1из наименьшего числа, которое в большинстве случаев уменьшается до максимального, но, опять же, не гарантируется.
stefan 19.11.2013 06:28:35
@stephan, я только предполагал, что платформа использует двоичное представление целых чисел. Таким образом, (1 << (nOfBits - 1))я помечаю бит знака как 1 и сохраняю все остальные биты равными нулю, чтобы получить минимальное отрицательное целое число. Я согласен, что ((1 << (nOfBits - 1)) - 1)это не очень хороший подход, чтобы получить максимум, и лучшим может быть что-то вроде, (~(1 << (nOfBits - 1)))например, использование чисто побитовых операций. Это весело обсуждать с вами.
Shaohong Li 19.11.2013 07:21:54