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

StackOverflow https://stackoverflow.com/questions/1819189

  •  10-07-2019
  •  | 
  •  

Вопрос

Может 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?

Это было полезно?

Решение

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

  • 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.

Другие советы

Размер числовых типов не определен в стандарте 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-битном настольном компьютере.

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

#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.

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

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, которое вас интересует.

Примечание: этот подход не будет работать для чисел с плавающей запятой (то есть удваивается или с плавающей запятой).

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

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

-2147483648 to 2147483647

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

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

Для типа данных без знака бит знака отсутствует, и все биты предназначены для данных. ; тогда как для подписанного типа данных 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 

Например,

Для unsigned int size = 4 байта (32 бита) - > Диапазон [0, (2 ^ (32)) - 1]

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

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

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

НЕТ

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top