Какой диапазон значений могут хранить целочисленные типы в C ++ - PullRequest
72 голосов
/ 30 ноября 2009

Может ли unsigned long int содержать десятизначный номер (1 000 000 000 - 9 999 999 999) на 32-разрядном компьютере?

Кроме того, каковы диапазоны unsigned long int, long int, unsigned int, short int, short unsigned int и int?

Ответы [ 9 ]

117 голосов
/ 30 ноября 2009

минимум диапазоны, на которые вы можете положиться:

  • short int и int: от -32 767 до 32 767
  • unsigned short int и unsigned int: от 0 до 65 535
  • long int: от -2 147 483 647 до 2 147 483 647
  • unsigned long int: от 0 до 4 294 967 295

Это означает, что нет, на long int нельзя полагаться для хранения любого 10-значного числа. Однако больший тип long long int был представлен для C в C99 и C ++ в C ++ 11 (этот тип также часто поддерживается как расширение компиляторами, созданными для более старых стандартов, которые его не включали). Минимальный диапазон для этого типа, если ваш компилятор поддерживает это:

  • long long int: -9,223,372,036,854,775,807 до 9,223,372,036,854,775,807
  • unsigned long long int: от 0 до 18,446,744,073,709,551,615

Так что этот тип будет достаточно большим (опять же, , если у вас есть в наличии).


Примечание для тех, кто считает, что я допустил ошибку с этими нижними границами - у меня нет. Требования C для диапазонов написаны так, чтобы допускать их целочисленные представления в виде дополнения или величины знака, где самое низкое представимое значение и самое высокое представимое значение отличаются только знаком. Также разрешено иметь представление дополнения до двух, где значение со знаковым битом 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимое для представления значения -32,768.

29 голосов
/ 30 ноября 2009

Размер числовых типов не определен в стандарте C ++, хотя минимальные размеры таковы. Чтобы определить, какого размера они на вашей платформе, используйте числовые ограничения

Например, максимальное значение для int можно найти:

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

Компьютеры не работают в базе 10, что означает, что максимальное значение будет в форме 2 n -1 из-за того, как числа представляют в памяти. Возьмем, к примеру, восемь бит (1 байт)

  0100 1000

Самый правый бит (число), установленный в 1, представляет 2 0 , следующий бит 2 1 , затем 2 2 и так далее, пока мы получить самый левый бит, который, если число без знака, представляет 2 7 .

Таким образом, число представляет 2 6 + 2 3 = 64 + 8 = 72, потому что установлены 4-й бит справа и 7-й бит справа налево.

Если мы установим все значения в 1:

11111111

Число теперь (при условии без знака )
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
И, как мы видим, это максимально возможное значение, которое может быть представлено 8 битами.

На моей машине и int, и long одинаковы, каждый из них способен удерживать от -2 31 до 2 31 - 1. По моему опыту, самый распространенный размер на современном 32-битный настольный компьютер.

9 голосов
/ 24 июля 2013

Чтобы узнать ограничения для вашей системы:

#include <iostream>
#include <limits>
int main(int, char **) {
  std::cout
    << static_cast< int >(std::numeric_limits< char >::max()) << "\n"
    << static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
    << std::numeric_limits< short >::max() << "\n"
    << std::numeric_limits< unsigned short >::max() << "\n"
    << std::numeric_limits< int >::max() << "\n"
    << std::numeric_limits< unsigned int >::max() << "\n"
    << std::numeric_limits< long >::max() << "\n"
    << std::numeric_limits< unsigned long >::max() << "\n"
    << std::numeric_limits< long long >::max() << "\n"
    << std::numeric_limits< unsigned long long >::max() << "\n";
}

Обратите внимание, что long long допустимо только в C99 и C ++ 11.

7 голосов
/ 30 ноября 2009

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

unsigned int ui;
std::cout <<  sizeof(ui));

это (в зависимости от компилятора и archicture) напечатает 2, 4 или 8, скажем, 2 байта длиной, 4 байта длиной и т. Д.

Предположим, что это 4.

Теперь вы хотите, чтобы максимальное значение, которое могут хранить 4 байта, максимальное значение для одного байта (в шестнадцатеричном формате) 0xFF. Максимальное значение четырех байтов равно 0x, за которыми следуют 8 f (одна пара f для каждого байта, 0x сообщает компилятору, что следующая строка является шестнадцатеричным числом). Теперь измените вашу программу, чтобы присвоить это значение и выведите результат

unsigned int ui = 0xFFFFFFFF;
std::cout <<  ui;

То есть максимальное значение, которое может хранить беззнаковое целое, как показано в представлении базы 10.

Теперь сделайте это для длинных, коротких шорт и любого другого значения INTEGER, которое вас интересует.

NB. Этот подход не будет работать для чисел с плавающей запятой (т. Е. Double или float).

Надеюсь, это поможет

6 голосов
/ 21 сентября 2015

В C ++ теперь int и другие данные хранятся с использованием метода комплимента 2. Это означает, что диапазон:

-2147483648 to 2147483647

или от -2 ^ 31 до 2 ^ 31-1

1 бит зарезервирован для 0, поэтому положительное значение на единицу меньше 2 ^ (31)

2 голосов
/ 30 ноября 2009

Для тип данных без знака бит знака отсутствует, и все биты предназначены для данных. ; тогда как для тип данных со знаком MSB указан бит знака, а остальные биты для данных.

Чтобы найти диапазон, сделайте следующее:

Шаг: 1 -> Найти ни одного байта для данного типа данных.

Шаг: 2 -> Применить следующие вычисления.

      Let n = no of bits in data type  

      For signed data type ::
            Lower Range = -(2^(n-1)) 
            Upper Range = (2^(n-1)) - 1)  

      For unsigned data type ::
            Lower Range = 0 
            Upper Range = (2^(n)) - 1 

Например,

Для целого размера без знака = 4 байта (32 бита) -> Диапазон [0, (2 ^ (32)) - 1]

Для целого размера со знаком = 4 байта (32 бита) -> Диапазон [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]

1 голос
/ 30 ноября 2009

Нет, только часть десятизначного числа может быть сохранена в беззнаковом длинном int, допустимый диапазон которого составляет от 0 до 4 294 967 295. Вы можете сослаться на это: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx

0 голосов
/ 30 ноября 2009

Может ли unsigned long int содержать десятизначное число (1 000 000 000 - 9 999 999 999) на 32-разрядном компьютере.

нет

Нет

0 голосов
/ 30 ноября 2009

Вы должны посмотреть на специализации шаблона numeric_limits <> для данного типа. Это в шапке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...