Какой диапазон значений могут хранить целочисленные типы в C ++
Вопрос
Может 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,767unsigned short int
иunsigned int
:от 0 до 65,535long int
:-2,147,483,647 - 2,147,483,647unsigned 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,807unsigned 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-разрядном компьютере.
НЕТ
Вы должны взглянуть на специализации числовых_лимитов < > шаблон для данного типа. Это в шапке.